AVR128单片机驱动SSD1289
BK-AVR128说明书
图标,按提示直至安装完成.若提
第三章 快速入门
3.1 第一个 ICC AVR 程序 本章假设用户已经安装好所有必需的软件,如 ICCAVR AVRstudio,我们将以一 个 LED 闪 烁 程 序 讲 述 用 ICCAVR 开 发 软 件 编 写 一 个 简 单 的 程 序 , 并 在 BK-AVR128 开发反上进行实验及仿真.
8
点击 change 可改变软件的安装路径,一般按默认即可不用修改。
点击“Next”
9
点击 “Install”然后等待软件安装完成。
点击 “Finish” 软件安装完成。 2.3 ISP 下载器驱动安装
10
将我们提供的 USB 下载器软件及驱动文件解压到你的硬盘上,并将 ISP 下载器 插到计算机的 USB 接口。 如果之前还没安装过 USBASP 下载器驱动,插入 USB 后您的计算机将自动弹出下列提示框, 引导您安装 USB 驱动软件
2) 软件设置及使用 打开 AVRstudio 软件
19
执行菜单栏的”File|Open File”
20
选择.cof 后缀的文件,点击”打开”. 点击”保存”
21
选择芯片型号为 Atmega128,仿真器型号为 JTAG ICE,Port 端口号根据实际情 况设置(最大不能超过 com4),以上都设置好后点击 Finish 进入仿真操作. 端口号的查询方法:在桌面上”我的电脑图标”右击,选择“管理”-----设备管理 器------端口(COM 和 LPT)如下图
数码管(段 E)
数码管(段 F)
数码管(段 G)
数码管(段 dp)
矩阵键盘(行 1) 按键 K17
AT24C02(SCL)
矩阵键盘(行 2) 按键 K18
飞思卡尔16位单片机9S12XS128使用和程序
飞思卡尔16位单片机9S12XS128使用收藏最近做一个关于飞思卡尔16位单片机9S12XS128MAA的项目,以前未做过单片机,故做此项目颇有些感触。
现记录下这个艰辛历程。
以前一直是做软件方面的工作,很少接触硬件,感觉搞硬件的人很高深,现在接触了点硬件发现,与其说使用java,C#等语言写程序是搭积木,不如说搞硬件芯片搭接的更像是在搭积木(因为芯片是实实在在拿在手里的东西,而代码不是滴。
还有搞芯片内部电路的不在此列,这个我暂时还不熟悉)。
目前我们在做的这个模块,就是使用现有的很多芯片,然后根据其引脚定义,搭接出我们需要的功能PCB板,然后为其写程序。
废话不多说,进入正题。
单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM 8KB,EEPROM:2KB,FLASH:128KB,外部晶振16M,通过内部PLL可得40M总线时钟。
9S12XS128MAA单片机拥有:CAN:1个,SCI:2个,SPI:1个,TIM:8个,PIT:4个,A/D:8个,PWM:8个下面介绍下我们项目用到的几个模块给出初始化代码1、时钟模块初始化单片机利用外部16M晶振,通过锁相环电路产生40M的总线时钟(9S12XS128系列标准为40M),初始化代码如下:view plaincopy to clipboardprint?/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC 端的COM口上去。
ATMEGA128实验开发板用户手册
ATMEGA128实验开发板用户手册V1.32011年5月E-mail: sdfdlut@1. ATMEGA128单片机概述ATMEGA128单片机是ATMEL公司推出的一款基于AVR内核,采用RISC结构,低功耗CMOS的8位单片机。
由于在一个周期内执行一条指令,ATMEGA128可以达到接近1MIPS/MHz的性能。
其内核将32个工作寄存器和丰富的指令集联结在一起,所有的工作寄存器都与ALU(逻辑单元)直接连接,实现了在一个时钟周期内执行一条指令可以同时访问两个独立的寄存器。
这种结构提高了代码效率,是AVR的运行速度比普通的CISC单片机高出10倍。
ATMEGA128单片机具有以下特点:128KB的可在系统编程/应用编程(ISP/IAP)Flash 程序存储器,4KB E2PROM,4KB SRAM,32个通用工作寄存器,53个通用I/O口,实时时钟计数器(RTC),4个带有比较模式灵活的定时器/计数器,2个可编程的USART接口,一个8为面向字节的TWI(I2C)总线接口,8通道单端或差分输入的10位ADC(其中一个差分通道为增益可调),可编程带内部振荡器的看门狗定时器,一个SPI接口,一个兼容IEEE 1149.1标准的JTAG接口(用于在线仿真调试和程序下载),6种可通过软件选择的节电模式。
2. ATMEGA128实验开发套件本实验开发套件包括:●测试通过的MEGA128实验板1块;●配套资料光盘1张;●AVR ISP并口下载线1条;●5110液晶模块1个;●遥控器1个;●USB ASP下载线(选配);●AVR JTAGICE仿真器(选配)。
其中资料光盘的内容主要包括:●ATMEGA128实验开发板用户手册.pdf(本文档);●AVR教程:⏹WINAVR 使用入门.pdf⏹AVR Studio 使用入门.pdf⏹AVR基本硬件线路设计与分析.pdf⏹芯艺的AVR_GCC教程.pdf⏹AVR的IO结构分析与范例.mht⏹AVR高速嵌入式单片机原理与应用●芯片手册(包括24C02、74HC595以及中文的I2C协议文档等内容)●开发工具软件;⏹AVR Studio V4.12;⏹WINAVR(GCC) 编译器;⏹IAR for AVR V4.10A;⏹并口下载工具PONYPROG V2.06;⏹ICCAVR 双龙提供;图3 新建工程对话框点击Next,进入第三步。
AVR单片机 mega128 例程大全
//16超声波LED显示#include <iom16v.h>//PA0接控制引脚PA7接接收引脚#include <macros.h>#define chao 100longint time=0;void delay(long int z){inti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void main(){int o=0;DDRD=0xff;DDRA=0x0f;TCNT1H=0x00;TCNT1L=0x00;while(1){PORTA=0x0f;delay(1);PORTA=0x00;while((PINA&0x80)==0x00); TCCR1B=0x03;while((PINA&0x80)==0x80); TCCR1B=0x00;time=TCNT1H*256+TCNT1L; TCNT1H=0x00;TCNT1L=0x00;if(time<chao){if(time<chao){o=500;while(o--)PORTD=0x04;}}if(time>chao){if(time>chao){o=500;while(o--)PORTD=0x08;}}}}//AD#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF))));addata=ADCL;addata=addata+ADCH*256;returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7);delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count){PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main(){unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//ADC#include<iom128v.h>#include<macros.h>#define unint unsigned int#define unchar unsigned char#pragma data:codeconst table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unint mega128_ad(){unintaddata;DDRF&=~BIT(0);PORTF&=~BIT(0);ADMUX=0;ADCSRA=0X80;ADCSRA|=BIT(ADSC);while(!(ADCSRA&(BIT(ADIF)))); addata=ADCL;addata=addata+ADCH*256; returnaddata;}void show(count){unchar temp1,temp2,temp3,temp4;temp1=count/1000;temp2=(count%1000)/100;temp3=(count%100)/10;temp4=count%10;HC_595_OUT(table[temp4]);DDRB|=(1<<4);PORTB|=(1<<4);delay(10);DDRB|=(1<<4);PORTB&=~(1<<4);HC_595_OUT(table[temp3]);DDRB|=(1<<5);PORTB|=(1<<5);delay(10);DDRB|=(1<<5);PORTB&=~(1<<5);HC_595_OUT(table[temp2]);DDRB|=(1<<6);PORTB|=(1<<6);delay(10);DDRB|=(1<<6);PORTB&=~(1<<6);HC_595_OUT(table[temp1]);DDRB|=(1<<7);PORTB|=(1<<7); delay(10);DDRB|=(1<<7);PORTB&=~(1<<7);}void HC_595_OUT(count) {PORTB&=~(1<<0);SPDR =count ;while(!(SPSR & (1<<SPIF)));delay(10);PORTB|=(1<<0);}void delay(z){unintx,y;for(x=0;x<z;x++)for(y=0;y<200;y++);}void main()unintcount,chl;DDRC |= (1<<7);PORTC &= (1<<7);PORTB = 0x0F;DDRB |= (1<<2)|(1<<1)|(1<<0);SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);while(1){count=mega128_ad();//用参数代替老是出问题,这一点需要再次认知考虑/*for(i=0;i<4;i++){ad[3-i]=shuzhi%10;shuzhi=shuzhi/10;}*/show(count);}}//CTC//该程序并未在示波器上测试,在仿真软件上仿真时只有PB5上有方波信号出现#include <iom128v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intvoid main(){DDRB|=0X60;TCCR1A=0X50;TCCR1B=0X09;OCR1A=0X7CF;}//D口矩阵键盘检测#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar temp1,temp2,temp3,temp4;unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]);PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data){PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}void delay_1us(void) //1us延时函{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();voidBuzz_init(void){DDRG |= (1<<4);PORTG &=~ (1<<4);}void Beep(unsigned intH_time,unsignedintL_time) {PORTG |= (1<<4);delay_nms(H_time);PORTG &=~ (1<<4);delay_nms(L_time);}intkey_press(void){int k;delay_nms(5);PORTD=0x01;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x11) {Beep(100,50); PORTA=0x1F;k=1;}else if(PIND==0x21) {Beep(100,50); PORTA=0xFD;k=2;}else if(PIND==0x41) {Beep(100,50); PORTA=0xFB;k=3;}else if(PIND==0x81) {Beep(100,50);PORTA=0xF7;k=4;}else {;}} else {;}} else {;}//第二行delay_nms(5);PORTD=0x02;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x12){Beep(100,50);PORTA=0x1F;k=5;}else if(PIND==0x22) {Beep(100,50); PORTA=0xFD;k=6;}else if(PIND==0x42) {Beep(100,50); PORTA=0xFB;k=7;}else if(PIND==0x82) {Beep(100,50); PORTA=0xF7;k=8;}else {;}} else {;}} else {;}//第三行delay_nms(5);PORTD=0x04;delay_nms(5);if((PIND&0xF0)!=0x00){delay_nms(10);if((PIND&0xF0)!=0x00){if(PIND==0x14){Beep(100,50);PORTA=0x1F;k=9;}else if(PIND==0x24){Beep(100,50);PORTA=0xFD;k=10;}else if(PIND==0x44){Beep(100,50);PORTA=0xFB;k=11;}else if(PIND==0x84){Beep(100,50);PORTA=0xF7;k=12;}else {;}} else {;}} else {;}//第四行delay_nms(5);PORTD=0x08;delay_nms(5);if((PIND&0xF0)!=0x00) {delay_nms(10);if((PIND&0xF0)!=0x00) {if(PIND==0x18){}else if(PIND==0x28) {Beep(100,50); PORTA=0xFD;k=14;}else if(PIND==0x48) {Beep(100,50); PORTA=0xFB;k=15;}else if(PIND==0x88) {Beep(100,50); PORTA=0xF7;k=16;}else{;}} else {;}} else {;}return k;}void main(void){inti,j,x;DDRA=0xFF;PORTA=0xFF;DDRD=0x0F;DDRE=0xFF;PORTE=0xFF;Buzz_init();while(1){x=key_press();HC_595_init();Seg7_Led_display(x);}}//1602液晶#include<iom128v.h>#define uchar unsigned char#define uint unsigned int#define uchar unsigned char#define uint unsigned int#define RS 0#define RW 1#define EN 2ucharwz[]={"*WEN.JIU.LONG*"}; uchargd[]={"Good Luck!"}; voids_ms(uintms){for(;ms>1;ms--);}//写指令voidwritecom(uchar com){PORTC&=~(1<<RS); //RS=0 命令选择PORTC&=~(1<<RW); //RW=0 写选择PORTC|=(1<<EN); //EN=1 使能信号s_ms(500);PORTA = com; //输出指令s_ms(500);PORTC&=~(1<<EN); //EN=0}//1602初始化void LcdInit(void){writecom(0x01);writecom(0x02);writecom(0x06);writecom(0x0c);writecom(0x38); //没理解好这里设置的是四位总线,而且设不成5X10的点阵}//============================================ ====================// 描述:在任意位置写任意多个字符// 入口:’row‘要写的字符所在的行,只能为1或2;// ‘col’要写的字符所在的列,只能为0---15 // ‘num’要写字符的个数// ‘pbuffer’要写字符的首地址//============================================ ======================void WriteChar(ucharrow,ucharcol,uintnum,uchar*pBuffer){uchari,t,add;if (row == 1) add = 0x80 + col+0x10;else add = 0x80+0x40 + col+0x10;writecom(add);PORTC&=~(1<<RW);s_ms(500);PORTC|=(1<<RS);for(i=num;i!=0;i--){t = *pBuffer;PORTA = t;PORTC|=(1<<EN);s_ms(500);//必须有个延时PORTC&=~(1<<EN);pBuffer++;}}void main(){int i;DDRA=0xff;PORTA=0xff;DDRC=0xff;PORTC=0xff;LcdInit();WriteChar(1,1,14,wz); WriteChar(2,3,10,gd);for(i=0;i<16;i++){writecom(0X18);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);s_ms(50000);}}//按键加显示的最简写法.txt#include "config.h"#include <iom128v.h>#include <macros.h>#define unint unsigned int#define unchar unsigned charconst unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};unchar Seg7_Led_Buf[4],temp1,temp2,temp3,temp4; unintdata,z;void HC_595_init(){DDRC=0x80;PORTC=0x00;PORTB=0x0F;DDRB=0x07;SPCR =0x53;}void Seg7_Led_display(unint data) {unchar temp1,temp2,temp3,temp4;temp1=data/1000;temp2=(data%1000)/100;temp3=(data%100)/10;temp4=data%10;HC_595_OUT(Seg7_Data[temp4]);PORTB|=(1<<4);delay(20);PORTB&=~(1<<4);HC_595_OUT(Seg7_Data[temp3]);PORTB|=(1<<5);delay(20);PORTB&=~(1<<5);HC_595_OUT(Seg7_Data[temp2]); PORTB|=(1<<6);delay(20);PORTB&=~(1<<6);HC_595_OUT(Seg7_Data[temp1]); PORTB|=(1<<7);delay(20);PORTB&=~(1<<7);}void HC_595_OUT(unchar data) {PORTB=0x06;SPDR =data ;while(SPSR==0);delay(10);PORTB=0x01;}void delay(unint z){uninti,j;for(i=0;i<z;i++)for(j=0;j<100;j++);}voidKey_init(void){KEY_DDR &=~ 0xFF;KEY_PORT |= 0xFF;}unsigned char get_key(void){unsigned char Key_Value,tmp;Key_Value=KEY_PIN & 0xFF;if(Key_Value != 0xFF){delay_nms(2);if(Key_Value != 0xFF){Key_Value=PIND;}}returnKey_Value;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsignedint i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1ms();}voidBuzz_init(void){BUZZ_DDR |= (1<<SPK);BUZZ_PORT &=~ (1<<SPK);}void Beep(unsigned intH_time,unsignedintL_time){BUZZ_PORT |= (1<<SPK); delay_nms(H_time); BUZZ_PORT &=~ (1<<SPK); delay_nms(L_time);}void main(void){unsigned char Key;DDRA=0xFF;PORTA=0x00;DDRE = 0xFF;PORTE = 0xFF;Key_init();Buzz_init();while(1){int w=10;Key=get_key();switch(Key){case (0xFE):{Beep(100,50);PORTA=0xFE;break;}case (0xFD):{Beep(100,50);PORTA=0xFD;HC_595_init();Seg7_Led_display( 617);break;}case (0xFB):{Beep(100,50);PORTA=0xFB;HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xF7):{PORTA=0xF7;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0xEF):{PORTA=0xEF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 617);}break;}case (0xDF):{PORTA=0xDF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 327);}break;}case (0xBF):{PORTA=0xBF;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}case (0x7F):{PORTA=0x7F;Beep(100,50);HC_595_init();while(w--){Seg7_Led_display( 307);}break;}default:{break;}}}}//18B20#include "config.h" #include <iom128v.h> #include <macros.h> #include "hc595.h" #include "spi.h"#include "18b20.h" voidspi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}voidSPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,//0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//a,b,c,d,e,fvolatile unsigned char Seg7_Led_Buf[4],point=0,point_pos=0;//point是小数点标志1代表有小数点point_pos表示小数点位置void HC_595_init(void){OE_DDR |= (1<<OE);OE_PORT &= (1<<OE);PORTB = 0x0F;spi_init();Seg7_Led_Buf[0]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[3]=16;}void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();void Seg7_Led_Update(void){HC_595_OUT(Seg7_Data[Seg7_Led_Buf[0]]);Seg7_Bit0_En();delay_nus(60);Seg7_Bit0_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[1]]);if((point==1)&&(point_pos==1))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[1]])|(1<<dp)); Seg7_Bit1_En();delay_nus(60);Seg7_Bit1_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[2]]);if((point==1)&&(point_pos==2))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[2]])|(1<<dp)); Seg7_Bit2_En();delay_nus(60);Seg7_Bit2_Dis();HC_595_OUT(Seg7_Data[Seg7_Led_Buf[3]]);if((point==1)&&(point_pos==3))HC_595_OUT((Seg7_Data[Seg7_Led_Buf[3]])|(1<<dp)); Seg7_Bit3_En();delay_nus(60);Seg7_Bit3_Dis();}void Seg7_Led_display(unsigned int data){if(data>9999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>999){Seg7_Led_Buf[3]=data/1000;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>99){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=(data%1000)/100;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else if(data>9){Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=(data%100)/10;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}else{Seg7_Led_Buf[3]=16;Seg7_Led_Buf[2]=16;Seg7_Led_Buf[1]=16;Seg7_Led_Buf[0]=data%10;Seg7_Led_Update();}}/********************************************* ****************************** 函数名称:HC595显示浮点数据** 功能描述:** 输入:** 输出:** 全局变量:** 调用模块:** 说明:** 注意:********************************************** ****************************/void Seg7_Led_float(float data){unsignedint temp;/*重要说明:data+=0.00001;其中0.00001为容错值解决float数据类型在计算机内部存储的误差问题,可以解决显示问题但是会引入新的计算误差,如果精度要求大于0.00001建议更改容错值或者将此处注释掉*/data+=0.00001;point=1;if(data>999) //错误处理,超出显示范围则全亮{HC_595_OUT(0xFF);Seg7_Bitselect_PORT|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1) |(1<<Seg7_Bit2)|(1<<Seg7_Bit3));}else if(data>99){temp=data*10;point_pos=1;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else if(data>9){temp=data*100;point_pos=2;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}else{temp=data*1000;point_pos=3;Seg7_Led_Buf[3]=temp/1000;Seg7_Led_Buf[2]=(temp%1000)/100;Seg7_Led_Buf[1]=(temp%100)/10;Seg7_Led_Buf[0]=temp%10;Seg7_Led_Update();}point=0;}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsignedint i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{。
AVR单片机相关软件安装及编译烧写流程
AVR单片机相关软件安装本次项目开发使用AVR的AT90CAN128单片机,使用JTAG ICE仿真器,需要安装的软件及驱动有AVRStudio、iccavr、USB转串口驱动以及仿真器驱动。
一、AVRStudio软件安装1. 双击开始准备安装2.单击“Next”,选择同意License3. 选择安装路径4. 选择USB 驱动5. 确定开始安装6.安装中7. 安装完成二、iccavr软件安装1.双击,接着双击iccv7avrV7.22Setup.msi,开始装备安装2. 单击下一步3. 选择安装路径4. 点击安装5. 安装完成三、USB转串口驱动1.双击,点击INSTALL,等待安装完成即可四、仿真器驱动安装(XP版)1. 双击点击SETUP.EXE安装2.安装完成,重新启动计算机AVR单片机编译烧写流程本文以在AT90CAN128芯片上编写的工程can128_sw_defn为例,简单介绍A VR 单片机的编译和烧写流程:一、A VR单片机编译流程1. 打开ICCA VR软件,下拉菜单栏上Project,点击open,弹出对话框如下:选择can128_sw_defn.prj打开,点击右侧栏中的can128_sw_defn.C文件,修改代码。
2. 点击Project->options,或者点按钮,弹出对话框如下:在Target下面的Device Configuration中选择芯片为AT90CAN128,如图所示,点击OK。
3. 点击Build Project,调试栏出现下图即为编译成功,若有错误请根据错误指示进行相应代码修改即可。
二、AVR单片机烧写流程1. 将JTAG ICE与目标板以及PC机相连。
2. 打开A VRStudio,将会提示一个welcome对话框,如下图所示:点“Cancel”即可,然后点击avr studio主窗口中的图标前面标有Con的那个图标,然后按下图选择点“Connect”即可进行JTAG的联机(由于avr studio会记忆用户使用的设备是并且同时会记忆用户使用的COM号,如果下次和上次使用的是相同的设备并且没有更换COM口,那么下次使用的时候直接点击右边标有AVR的那个图标就可以快速进入联机状态;如果下次和上次使用了不同的设备或不同的COM口请使用Con图标进行联机)。
AVR MEGA128 编写的SDHC驱动程序
unsigned int i;
unsigned char r1,j;
NOCC_S
{
HDSC_CS_OFF();
r1 = SDHC_CMD(0x80 | HDSC_READ_BLOCK,sector,0);
if (r1 == 0)
{
unsigned char i,ret;
SPI_WRITE(0xFF); //Dummy write
HDSC_CS_OFF();
SPI_WRITE(command & 0x7f);
SPI_WRITE((unsigned char)(adress>>24)); //MSB of adress
do
{
by = SDHC_CMD(SDHC_CMD55, 0, 0xFF);
i --;
if(by == 0x01)
SPSR=0x00;
for(j=0; j<16; j++) SPI_WRITE(0xFF); //give min 74 clock pulses before
j = 200; //send CMD0 for RESET
do
{
by = SDHC_CMD(HDSC_RESET,0,0x95);
{
i = 0;
while (1)
{
SPI_WRITE(0xFF);
r1 = SPDR;
if (r1 == 0xFE) break;
if (r1 == 0xFF)
{
if (++ i > 3000) break;
SPI_WRITE(0xFE);
ATmega128 单片机硬件电路设计
ATmega128 单片机硬件电路设计在本系统中,本小节主要讲ATmega128 单片机的内部资源、工作原理和硬件电路设计等。
2.5.1 ATmega128 芯片介绍ATmega128 为基于AVR RISC 结构的8 位低功耗CMOS 微处理器。
片内ISP Flash 可以通过SPI 接口、通用编程器,或引导程序多次编程。
引导程序可以使用任何接口来下载应用程序到应用Flash 存储器。
通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega128 为许多嵌入式控制应用提供了灵活而低成本的方案。
ATmega128 单片机的功能特点如下:(1)高性能、低功耗的AVR 8 位微处理器(2)先进的RISC 结构①133 条指令大多数可以在一个时钟周期内完成② 32x8 个通用工作寄存器+外设控制寄存器③全静态工作④工作于16 MHz 时性能高达16 MIPS ⑤只需两个时钟周期的硬件乘法器(3)非易失性的程序和数据存储器① 128K 字节的系统内可编程Flash ②寿命: 10,000 次写/ 擦除周期③具有独立锁定位、可选择的启动代码区(4)通过片内的启动程序实现系统内编程① 4K 字节的EEPROM ② 4K 字节的内部SRAM ③多达64K 字节的优化的外部存储器空间④可以对锁定位进行编程以实现软件加密⑤可以通过SPI 实现系统内编程(5)JTAG 接口(与IEEE 1149.1 标准兼容)①遵循JTAG 标准的边界扫描功能②支持扩展的片内调试③通过JTAG 接口实现对Flash,EEPROM,熔丝位和锁定位的编程(6)外设特点①两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器②两个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器③具有独立预分频器的实时时钟计数器④两路8 位PWM ⑤ 6 路分辨率可编程(2 到16 位)的PWM ⑥输出比较调制器⑦ 8 路10 位ADC ⑧面向字节的两线接口⑨两个可编程的串行USART ⑩可工作于主机/ 从机模式的SPI 串行接口(7)特殊的处理器特点①上电复位以及可编程的掉电检测②片内经过标定的RC 振荡器③片内/ 片外中断源④ 6 种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式⑤可以通过软件进行选择的时钟频率⑥通过熔丝位可以选择ATmega103 兼容模式⑦全局上拉禁止功能ATmega128 芯片有64 个引脚,其中60 个引脚具有I/O 口功能,资源比较丰富,下面对ATmega128 的各个引脚做简单介绍:VCC:数字电路的电源。
AVR 单片机驱动12864典型程序
RS_0; //指令======= 先写好指令--- 开使能---赋值---关闭使能
RW_0; //写
E_1; // 使能
PORTA=c; //
#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
////////////////////////管脚定义及电平///////
#define RS_1 PORTD|=BIT(6); //寄存器选择,高数据
E_0; //
}
//////////////////////////写数据到LCD//////////
void wdata(uchar c)
{
// lcd_busy(); //判断LCD忙
RS_1; //数据========先写好数据--- 开使能---赋值---关闭使能
RST_1;
delay(10);
}
////////////////判断LCD忙函数/////////
/*void lcd_busy(void)
{
uchar busy;
RS_0;
RW_1; //读指令寄存器
PORTA=0x00; //数据口清零
}
E_0;
delay(10); //否则,禁能
}
DDRA=0xff;
E_0; //禁能
}*/
////////////////////////////写指令到LCD/////////
AVR单片机ATmega128芯片BootLoader详细介绍
TIFR = TIFR|0x02;
}
}
//每秒向 PC 机发送一个控制字符"C",等待控制字〈soh〉
while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem
{
if(TIFR & 0x02)
//timer0 over flow
{
Target: Mega128
Crystal: 16Mhz
Used: T/C0,USART0
*****************************************************/
#include #define SPM_PAGESIZE 256
//M128的一个 Flash 页为256字节(128字)
void quit(void)
{
uart_putchar('O');uart_putchar('K');
uart_putchar(0x0d);uart_putchar(0x0a);
while(!(UCSR0A & 0x20));
//等待结束提示信息回送完成
MCUCR = 0x01;
MCUCR = 0x00;
区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。引导加载程序区的大小
可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。本节将给出一个实
际的的 Boot Loader 程序,它可以配合 Windows 中的超级终端程序,采用 Xmodem 传输协议,通过 RS232接口下载更新
史上最全的AVR128例程
自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。
于是自己去买了一块16L的芯片,觉得还行。
一开始用的是ICC A VR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。
后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile 可以用软件自带的组建自动生成,只需修改几个参数就可以用。
后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。
icc avr 是iom128v.h(姑且以128为例),winavr是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。
记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。
其实前两个软件只需把头文件稍微改一下基本上可以通用。
而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。
总体说winavr给人的感觉是比较专业1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionA VR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/***************************************************************************//*ADC测试程序*//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCA VR 7.13A *//*E-Mail:**********************//*时间:2010年11月13日*///Aref接A VCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//***************************************************************************//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/ extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/ unsigned int adc_rel=0;/****************************************************************************函数功能:ADC初始化函数入口参数:出口参数:****************************************************************************/ void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/**************************************************************************** 函数功能:ADC中断函数入口参数:出口参数:****************************************************************************/ #pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/**************************************************************************** 函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){int i;for(i=0;i<1800;i++);}/**************************************************************************** 函数功能:显示子程序入口参数:k出口参数:****************************************************************************/ void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,90x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,fvolatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595PORTB = 0x0F; //同时打开四个数码管的位选spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp));elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp));elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp));elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high valueTCNT1L = 0x81; //reload counter low valuecountnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData) {while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来 }}文件:eeprom12.rar大小:40KB下载:下载4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。
AVR128 单片机软硬件环境
AVR128 单片机软硬件环境AVR ATmega128系列单片机是Atmel公司生产的一款多功能单片机,可应用于多个用途,单片机主要有:CPU内核、存储器、定时器、各种串口、JTAG接口及片上调试系统等。
编程软件有ICC和GCC两种,通过Atmel Studio系列进行调试和生成可执行文件,本次我们主要应用Atmel Studio 7.0 进行软件模拟。
首先介绍一下Atmel Studio 7.0并建立一个工程文件USART 和电脑进行数据传输核通信,我们从以下几个方面介绍:1、实验环境2、软件介绍并建立工程3、USART通信协议简介4、设计软件并运行调试实验环境:硬件:PC机一台、JTAG调试器、AVR ATmega128A单片机软件:windows 10操作系统、Atmel Studio 7.0和sscom32(串口调试软件)软件介绍并建立工程Atmel Studio系列软件是Atmel公司为其生产的芯片设计的一款软件,其可支持软件编译、在线调试、串口烧写程序等。
Atmel Studio 7.0是atmel公司最新发布得一款软件,其内集成了GCC编译器,使用户更为方便得编译程序文件和在线调试。
以下是其软件简介:这是开机动画:打开后,你会看到Atmel Studio 7.0的完整界面,如下图所示:编译栏、开始栏、最近编译文件、在线简介等新建一个工程得步骤如下:New Project→ GCC C Excutable Project(Name 和Solution name一致,这里用USART0_0、保存路径可更改) 然后点OK →Device Selection→进入编译界面编译界面简介:工具栏有文件、编辑、工程、编译、调试、工具、窗口、帮助等系统自动生成C语言如下:下面这个工具栏包含(Dcice Programming)即闪电符号。
USART通信协议简介ATmega128 具有两个USART,USART0 和USART1,既有两个同步异步转发器,他们可根据具体要求设计其通信频率、帧格式等,下面来介绍具体细节。
AVR学习
A VR ATmega128单片机内部资源1.Flash 用来存储程序用的.2 EEprom 用来存储常量的此上二者掉电后都不丢失.3 SRAM 用来存储程序中产生的变量4 JTAG 用来下载和仿真5 ISP下载现在很少用6 TC 定时计数器,可以用来产生PWM波.7 多路10位ADC8 有UART 异步串口9 SPI 国步串口,现在有很多芯片都有此串口10 具有看门狗功能W ATCHDOG11 具有模拟比较器12 TWI 接口,也就是I2C接口.13 有多个能用IO 口.此系统单片机采用精简的RISC指令系统,执行代码速度快,大部分指令都可以在一个时钟周期内完成,而我们知道,51单片机要执行一条指令要经过12个时钟周期,所以在外部晶振频率一样的情况下,A VR单片机会比51系列的单片机速度快12倍,而其价格却和同类51单片机相同.电平学习1 TTL电平高电平5V,低电平0V2 CMOS电平高电平,2.5V,低电平0V3 RS232电平高电平-12V,低电平+12V运算符号的学习1.&& 与,在C中,用于条件的并存2,|| 或,在C中,用于条件的搜索3 ! 非用于条件取反4 & | ~ 这三个是两个数据按位进行与.或非5 ^ 这个是按位异或,即两个数相同,为0 ,不同为1.6 << >>此二个是左移和右移符号.EG:1<<(x),即是将0x01左移x位,低位补0.右移也是同理.注:BIT(x)=1<<(x);这个命令很常用.其中这个函数的说明在A VRdef.h这个头文件中.IO学习A VR单片机的IO口具有很强的驱动能力,可以达到20mA以上,可以直接驱动LED,数码管,和小型的继电器.每个IO口都有三个8位寄存器来控制其状态和行为.DDRxn 用来控制输入还是输出. 1为输出,0为输入.PORTxn 用来控制是否带有上拉电阻. 1为有上拉电阻,0为没有上拉电阻.PINxn 此寄存器不能进行写的功能,只能读,为当前IO口的高低电平.控制输出为高低电平很简单1 将要操作的IO口设置成输出状态,以A端口为类.若只让A端口的第2个(从0开始计数)IO输出为高电平,进行以下操作:DDRA=DDRA|BIT(2);2 将要输出为高电平的IO口设置成为有上拉电阻.即PORTA=PORTA|BIT(2);经过些两步的程序,A端口的第二个IO口输出为高电平,而其它的不变.完成C程序#include <iom128v.h> //这里说明了所有的寄存口地址与名字的对应#include<A VRdef.h> //这里有一些函数的定义,如BIT(x);V oid main(){DDRA=DDRA|BIT(2);PORTA=PORTA|BIT(2);}注意,如果想让A商品一次输出如0X55,则如下进行:DDRA=0XFF;//全部设置成为输出PORTA=0x55;//这样之后,PORTA就会输出0X55;也就是这样一个道理,当一个IO被设置成为输出状态时,如果有上拉电阻,就会输出高电平,没有上拉电阻,就会输出低电平.数据传输协议1 SPI协议同步串行SCK 串行时钟MISO 主机输入,从机输出MOSI 主机输出,从机输入SS SPI从机选择引角2JTAGTDI 测试数据输入TDO 测试数据输出TMS 测试模式选择TCK 测试时钟3两线串行TWI I2CSDA 两线串行数据输入输出线SCL 两线串行时钟4 UARTTXD 数据发送RXD 数据接收定时/计数器TC学习ATmage128单片机有4个定时计数器,其中有两个具有预分频和比较功能的8位TC,还有两个具有预分频,比较,和捕捉功能的16位定时器,其中TC0还可以外接32768HZ以下的时钟,以实现RTC实时计数.TC0相关的寄存器8 位1 TCCR0 TC0控制寄存器2TCNT0 TC0计数寄存器3OCR0 输出比较寄存器4TIMSK TC中断屏蔽寄存器(所有TC共用)5 TIFR TC中断标志寄存器(与TIMSK对应,也是所有TC共用)TC2 相关的寄存器8 位1 TCCR2 TC2控制寄存器2 TCNT2 TC2计数寄存器3 OCR2 输出比较寄存器4 TIMSK TC中断屏蔽害存器5 TIFR TC中断标志寄存器TC1相关寄存器, 16位1 TCCR1A2 TCCR1B3 TCCR1C 此三个8 位的寄存器共同组成TC1的控制寄存器4 TCNT1H5TCNT1L 此两个8 位寄存器共同组成TC1的计数寄存器6 OCR1AH7 OCR1AL 输出比较器A 16位的啊8 OCR1BH9 OCR1BL 输出比较器B 16位10 OCR1CH11 OCR1CL 输出比较器C 16位12 ICR1H13 ICR1L 输入捕捉寄存器16位14 TIMSK TC中断屏蔽寄存器8 位15 ETIMSK TC扩展中断屏蔽寄存器8 位16 TIFR TC中断标志寄存器17 ETIFR TC扩展中断标志寄存TC3和TC1有相同的定时器以上的寄存器分为5类TCCR TCNT OCR TIMSK TIFR 其中,TCCR 是用来控制寄存器的工作状态TCNT 是用来计数用的OCR 是用来和TCNT相比较,用来产生波型和中断的TIMSK 是用来屏蔽和开启TC中断的TIFR 是用来记录TC中断状态的下面主要介绍TC1的TCCR,因为它的功能比较全,其它三个TC的TCCR与此类似.1 TC 控制寄存器 TCCRNx 用来定义TC 的工作模式7 6 5 4 3 2 1 02 TC 计数寄存器 TCNTnx 用来计数注意,A VR 是8位单片机,其计数寄存器都是8位的,要是有16位的,则分成TCNTnh,TCNTnl.3 TC 中断屏蔽寄存器 TIMSK,注意,这个寄存器,是多个TC 共用的,用来用软件屏蔽和开启TC 中断. 4 输出比较寄存器OCR0 8 位输出比较寄存器是一个8位的数值,不间断的与TCNT0进行比较,当数据匹配时,可以产生输出比较中断5 TIFR TC 中断标志寄存器7 6 5 4 3 2 1 0普通模式1.通过TCNTnx的低三位来选择TC工作的时钟,2.给TCNTnx赋值,这里要注意一个问题,若定时计数器是16位的,刚TCNTnx会有两个8位的寄存器组成,TCNTnh,TCNTnl,赋值时要注意一个问题,要先高8位,再赋低8 位,这个顺序不能乱.3.能过TIMSK打开TC中断相应位7 6 5 4 3 2 1 0其中,TOIEn是溢出中断OCIEnx是输出比较中断4中断函数的注册#program interrupt_hander 函数名:中断向量号//为函数的注册函数为void 函数名(){}经过以上可得出,用TC时,有四个步骤,1 通过TCCRn来选择TC的工作模式2 给TCNTn赋值3 在TIMSK中打开相应中断4 注册的描述中断函数要想中断服务函数可以正常使用别忘记一个前提,打开总中断外部中断学习ATmega128有8 个外部中断INT0—INT7相关的控制器1 EICRA 外部中断控制寄存器A7 6 5 4 3 2 1 0每一组如ISC31,ISC30来控制相应外部中断的敏感电平2 EICRB 外部中断控制寄存器B 其作用和用法和EICRA相同3 EIMSK 外部中断屏蔽寄存器7 6 5 4 3 2 1 04 EIFR 外部中断标志寄存器当要用到外部中断的时候,有以下几个步骤,1 先打开总中断2 外部中断的引角要配置成输入模式,但中断的外部引角配置为输出时,只要电平发生了合适的变化,中断也会触发,所以利用这个特点,可以用软件来产生外部中断.3 能过EICRA或EICRB来定义敏感电平.4 EICRA和EICRB来打开外部中断位5中断函数的注册和描述# program interrupt_handle 函数名:中断向量号V oid 函数名(){}USART 通用同/异步串行口特点1全双工操作(独立的串行接收和发送寄存器)2异步或同步操作3主机或从机提供时钟的同步操作(一般不用同步操作)4高精度的波特率发生器5支持5,6,7,8,9个数据位和1个或2个的停止位6硬件支持的奇偶校验操作73个独立的中断:发送结束中断,发送数据寄存器空中断,以及接收结束中断USART寄存器说明1USARTn 数据寄存器,也可以叫UDRnUSART发送数据缓冲寄存器和USART接收数据缓冲寄存器共享一个IO地址,称为UDR,将数据写入UDR时,其实是写入发送数据寄存器,读UDR时,返回的是接收数据缓冲寄存器.2USART控制和状态寄存器A USCRnA7 6 5 4 3 2 1 0Bit 7 RXCn :USART接收结束接收缓冲器中有未读出的数据时RXCn置位,否则清0.接收器禁止时,接收缓冲器被刷新,导致RXCn清0,RXCn可以用来产生接收结束中断.Bit 6 TXCn :USART 发送结束发送缓冲器中的数据被送出,且当发送缓冲器为空时,TXCn置位.执行发送结束中断时TXCn标志自动清0.也可以通过写1进行清除操作.TXCn标志可用来产生发送中断.Bit 5 UDREn :USART数据寄存器空UDREn标志发送缓冲器UDRn是否准备好接收新的数据.为1时,说明已准备好进行数据接收.UDREn标志可用来产生数据寄存器空中断,复位时UDREn置位,表明发送器已经就绪.Bit 2UPEn:奇偶校验错误奇偶校验使能后,并发生奇偶校验错误,则置位.2USARTn控制和状态寄存器B UCSRnB7 6 5 4 3 2 1 0BIT7 RXCIEn 接收结束中断使能当TXCIEn全局中断标志位SREG置位,UCSBnA寄存器的RXCn这1时,可能产生USARTn接收结束中断.Bit 6 TXCIEn 发送结束中断使能.BIT5UDRIEn USART数据寄存器空中断使能.BIT4RXENn接收使能.置位后,将USARTn接收器,RXDn引脚的通用端口功能被USARTn功能所取代.禁止接收器将刷新接收缓冲器,并使Fen,DORn及UPEn标志无效.BIT3TXENn 发送使能置位后将启动发送器USARTn.3USART控制和状态寄存器C UCSRnC7 6 5 4 3 2 1 0Bit 6 UMSELn :USART模式选择Bit 5 :4 UPMn1:0 :奇偶校验模式这两位设置奇偶校验的模式并使能奇偶校验.如果使能了奇偶.那么在发送数据时,发适器都会自动产生并发送奇偶校验位.对每一个接收到的,接收器,都会产生一奇偶值,并与UPMn0所设置的值进行比较,如果不匹配,以就将UCSRnA中的UPEn置位.Bit 3 USBSn :停止位选择.能过这一位可以选择设置停止位的倍数.但是接收器是忽略这一位的设置的.Bit2:1---UXCZn1:0UCSZn1:0与寄存器UCSRnB的RCSZn2结合在一起可以设置数据帧包含的数据位数.BIT0 ---UCPOLn :时钟极性这一位仅用于同步工作模式.使用异步模式时,将这一位清0.5USART波特率寄存器(UBRRnL UBRRnH)用于存储不同外部晶振下的波特率设置。
飞思卡尔128单片机重点模块讲解
当我们将 A 口作输入口使用时需要设置 A 口内置上拉电阻时首先写 PUCR_PUPAE=1; 当我们将 B 口作输入口使用时需要设置 B 口内置上拉电阻时首先写 PUCR_PUPBE=1; 当我们将 E 口作输入口使用时需要设置 E 口内置上拉电阻时首先写 PUCR_PUPEE=1;
基于飞思卡尔 MC9S12XS128MCU 的模块讲解及测试
if(LED==0x20) //判断高电平信号是否移到第 6 位 LED=0x01; //重新赋初始值
} } � 源代码: (基于 STC52RC 单片机) #include "reg52.h" #define LED P1 // 选择 P1 口作为通用输出口 #define uchar unsigned char #define uint unsigned int void delay(uint a) { uint i,j; for(i=0;i<a;i++) for(j=0;j<a;j++) ; } void main() { LED=0x01; while(1) { LED=LED<<1; // 让高电平信号进行左移一位 // 点亮第一只发光二极管
基于飞思卡尔 MC9S12XS128MCU 的模块讲解及测试
安徽工业大学 自动化系 刘昌元 delay(500); if(LED==0x80) LED=0x01; } } 综合以上的两段代码看在 52 单片机和 128 单片机上编程思路基本上没大的区别,唯一的区 别就是 128 单片机有数据方向寄存器来管理 I/O 口。 � 将部分端口做输入口使用,另外一部分端口做输出口使用时:例如我们将 PORTB 的端 口 B7 用来做输入口,B0-B5 口做输出指示,测试代码如下:
SSD1289主控液晶的STM32驱动程序
SSD1289主控液晶的STM32驱动程序#include "GLCD.h"#include "AsciiLib.h"#include "Hzlib.h"#include "win7.h"/************************************************************** ****************** Function Name : Lcd_Configuration* Description : Configures LCD Control lines* Input : None* Output : None* Return : None* Attention : None*************************************************************** ****************/static void LCD_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);/*GPIOE=DATABUS*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOE, &GPIO_InitStructure);/* PD.13(RS), PD.14(WR), PD.15(RD),PD.12(CS) ,PD11(RST)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : LCD控制器寄存器地址* Input : - index: 寄存器地址* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteIndex(uint16_t index){Clr_Rs;Set_nRd;GPIOE->ODR = index;Clr_nWr;Set_nWr;}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : LCD寄存器数据* Input : - index: 寄存器数据* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteData(uint16_t data){Set_Rs;GPIOE->ODR = data;Clr_nWr;Set_nWr;}/************************************************************** ****************** Function Name : LCD_ReadData* Description : 读取控制器数据* Input : None* Output : None* Return : 返回读取到的数据* Attention : None*************************************************************** ****************/uint16_t LCD_ReadData(void){uint16_t value;Set_Rs;Set_nWr;Clr_nRd;GPIOE->CRH = 0x44444444;GPIOE->CRL = 0x44444444;value = GPIOE->IDR;value = GPIOE->IDR;GPIOE->CRH = 0x33333333;GPIOE->CRL = 0x33333333;Set_nRd;return value;}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : Writes to the selected LCD register.* Input : - LCD_Reg:address of the selected register.* - LCD_RegValue: value to write to the selected register.* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue){LCD_WriteIndex(LCD_Reg);LCD_WriteData(LCD_RegValue);}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : Reads the selected LCD Register.* Input : None* Output : None* Return : LCD Register Value.* Attention : None*************************************************************** ****************/uint16_t LCD_ReadReg(uint16_t LCD_Reg){uint16_t LCD_RAM;LCD_WriteIndex(LCD_Reg);LCD_RAM = LCD_ReadData();return LCD_RAM;}/************************************************************** ****************** Function Name : LCD_SetCursor* Description : Sets the cursor position.* Input : - Xpos: specifies the X position.* - Ypos: specifies the Y position.* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos ){LCD_WriteReg(0x004e, Ypos );LCD_WriteReg(0x004f, Xpos );}/************************************************************** ****************** Function Name : LCD_Delay* Description : Delay Time* Input : - nCount: Delay Time* Output : None* Return : None* Return : None* Attention : None*************************************************************** ****************/static void delay_ms(uint16_t ms){uint16_t i,j;for( i = 0; i < ms; i++ ){for( j = 0; j < 1141; j++ );}}/************************************************************** ****************** Function Name : LCD_Initializtion* Description : Initialize TFT Controller.* Input : None* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Initializtion(void){LCD_Configuration();Clr_Cs;Clr_Rst;delay_ms(100);Set_Rst;delay_ms(100);LCD_WriteReg(0x0000,0x0001);//打开晶振LCD_WriteReg(0x0010,0x0000);//退出休眠delay_ms(50);LCD_WriteReg(0x0001,0x293F);//横屏显示LCD_WriteReg(0x0007,0x0033);//LCD_WriteReg(0x0011,0x6838);//横屏显示LCD_WriteReg(0x0002,0x0600);/*gamma*/LCD_WriteReg(0x0030,0x0101);LCD_WriteReg(0x0031,0x0101);LCD_WriteReg(0x0032,0x0101);LCD_WriteReg(0x0033,0x0101);LCD_WriteReg(0x0034,0x0101);LCD_WriteReg(0x0035,0x0101);LCD_WriteReg(0x0036,0x0101);LCD_WriteReg(0x0037,0x0101);LCD_WriteReg(0x003A,0x0101);LCD_WriteReg(0x003B,0x0101);/*Pixel*/LCD_WriteReg(0x0044,0xEF00);LCD_WriteReg(0x0045,0x0000);LCD_WriteReg(0x0046,0x013F);}/************************************************************** ****************** Function Name : LCD_Clear* Description : 将屏幕填充成指定的颜色,如清屏,则填充 0xffff * Input : - Color: Screen Color* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Clear(uint16_t Color){uint32_t index=0;LCD_Window(0,319,0,239);for( index = 0; index <76800; index++ )LCD_WriteData(Color);}/************************************************************** ****************** Function Name : LCD_Window* Description : LCD窗口显示* Input : xs,xe,ys,ye窗口坐标* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Window(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye){LCD_WriteReg(0x0044,ys+(ye<<8));LCD_WriteReg(0x0045,xs);LCD_WriteReg(0x0046,xe);LCD_SetCursor(xs,ys);LCD_WriteIndex(0x0022);}/************************************************************** ***************** Function Name : LCD_GetPoint* Description : 获取指定座标的颜色值* Input : - Xpos: Row Coordinate* - Xpos: Line Coordinate* Output : None* Return : Screen Color* Attention : None*************************************************************** ****************/uint16_t LCD_GetPoint(uint16_t Xpos,uint16_t Ypos){uint16_t dummy;LCD_SetCursor(Xpos,Ypos);LCD_WriteIndex(0x0022);dummy = LCD_ReadData(); /* 空读一次 */dummy = LCD_ReadData();return dummy;}/************************************************************** ***************** Function Name : LCD_SetPoint* Description : 在指定座标画点* Input : - Xpos: Row Coordinate* - Ypos: Line Coordinate* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point){if( Xpos >= MAX_X || Ypos >= MAX_Y )return;LCD_SetCursor(Xpos,Ypos);LCD_WriteReg(0x0022,point);}/************************************************************** ***************** Function Name : LCD_DrawLine* Description : Bresenham's line algorithm* Input : - x1: A点行座标* - y1: A点列座标* - x2: B点行座标* - y2: B点列座标* - color: 线颜色* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_DrawLine( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1 , uint16_t color ){short dx,dy; /* 定义X Y轴上增加的变量值 */short temp; /* 起点终点大小比较交换数据时的中间变量 */if( x0 > x1 ) /* X轴上起点大于终点交换数据 */{temp = x1;x1 = x0;x0 = temp;}if( y0 > y1 ) /* Y轴上起点大于终点交换数据 */{temp = y1;y1 = y0;y0 = temp;}dx = x1-x0; /* X轴方向上的增量 */dy = y1-y0; /* Y轴方向上的增量 */if( dx == 0 ) /* X轴上没有增量画垂直线 */{do{LCD_SetPoint(x0, y0, color); /* 逐点显示描垂直线 */ y0++;}while( y1 >= y0 );return;}if( dy == 0 ) /* Y轴上没有增量画水平直线 */{do{LCD_SetPoint(x0, y0, color); /* 逐点显示描水平线 */ x0++;}while( x1 >= x0 );return;}/* 布兰森汉姆(Bresenham)算法画线 */if( dx > dy ) /* 靠近X轴 */{temp = 2 * dy - dx; /* 计算下个点的位置 */while( x0 != x1 ){LCD_SetPoint(x0,y0,color); /* 画起点 */x0++; /* X轴上加1 */if( temp > 0 ) /* 判断下下个点的位置 */{y0++; /* 为右上相邻点,即(x0+1,y0+1) */temp += 2 * dy - 2 * dx;}elsetemp += 2 * dy; /* 判断下下个点的位置 */}LCD_SetPoint(x0,y0,color);}else{temp = 2 * dx - dy; /* 靠近Y轴 */while( y0 != y1 ){LCD_SetPoint(x0,y0,color);y0++;if( temp > 0 ){x0++;temp+=2*dy-2*dx;}elsetemp += 2 * dy;}LCD_SetPoint(x0,y0,color);}}/************************************************************** ***************** Function Name : DrawCircle* Description : 在屏幕任意位置画圆* Input : - X0: 水平坐标* - Y0: 垂直坐标* - R: 圆半径* - Color: 圆颜色* Output : None* Return : None* Attention : None*************************************************************** ****************/void DrawCircle(uint16_t X0,uint16_t Y0,uint16_t R,uint16_t color){uint16_t a=0,b=0;int16_t di=0;b=R;di=1-R;while(a<=b){LCD_SetPoint(X0+b,Y0-a,color);//0LCD_SetPoint(X0-a,Y0+b,color);//1LCD_SetPoint(X0-a,Y0-b,color);//2LCD_SetPoint(X0-b,Y0-a,color);//3LCD_SetPoint(X0+b,Y0+a,color);//4LCD_SetPoint(X0+a,Y0-b,color);//5LCD_SetPoint(X0+a,Y0+b,color);//6LCD_SetPoint(X0-b,Y0+a,color);//7a++;if(di<0){di+=(a<<1)+3;}else{di+=((a-b)<<1)+5;b--;}}}/************************************************************** ***************** Function Name : PutChar* Description : 将Lcd屏上任意位置显示一个字符* Input : - Xpos: 水平坐标* - Ypos: 垂直坐标* - ASCI: 显示的字符* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void PutChar( uint16_t Xpos, uint16_t Ypos, uint8_t ASCI, uint16_t charColor, uint16_t bkColor,uint8_t ack){uint16_t i, j;uint8_t buffer[16], tmp_char;GetASCIICode(buffer,ASCI); /* 取字模数据 */LCD_Window(Xpos,Xpos+7,Ypos,Ypos+15); LCD_WriteIndex(0x0022);if(ack==0){for( i=0; i<16; i++ ){tmp_char = buffer[i];for(j=0;j<8;j++){if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ elseLCD_ReadData();/*无背景色*/}}}else{for( i=0; i<16; i++ ){tmp_char = buffer[i];for(j=0;j<8;j++){if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ elseLCD_WriteData(bkColor); /* 背景颜色 */}}}}/************************************************************** ***************** Function Name : GUI_Text* Description : 在指定座标显示字符串* Input : - Xpos: 行座标* - Ypos: 列座标* - str: 字符串* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack){uint8_t TempChar;do{TempChar = *str++;PutChar( Xpos, Ypos, TempChar, Color, bkColor ,ack);if( Xpos < MAX_X - 8 )Xpos += 8;else if ( Ypos < MAX_Y - 16 ){Xpos = 0;Ypos += 16;}else{Xpos = 0;Ypos = 0;}}while ( *str != 0 );}/************************************************************** ***************** Function Name : PutChinese* Description : 将Lcd屏上任意位置显示一个中文字* Input : - Xpos: 水平坐标* - Ypos: 垂直坐标* - str: 显示的中文字* - Color: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_tbkColor,uint8_t ack){uint8_t i,j;uint8_t buffer[32];uint16_t tmp_char=0;GetGBKCode(buffer,str); /* 取字模数据 */ LCD_Window(Xpos,Xpos+15,Ypos,Ypos+15); if(ack==0){for ( i = 0; i < 16; i++ ){tmp_char = buffer[i*2];tmp_char = ( tmp_char << 8 );tmp_char |= buffer[2*i+1];for (j = 0; j < 16; j++ ){if ( (tmp_char >> 15-j ) & 0x01 == 0x01 ) LCD_WriteData(Color); /* 字符颜色 */elseLCD_ReadData(); /* 无背景颜色 */}}}else{for ( i = 0; i < 16; i++ ){tmp_char = buffer[i*2];tmp_char = ( tmp_char << 8 );tmp_char |= buffer[2*i+1];for (j = 0; j < 16; j++ ){if ( (tmp_char >> 15-j ) & 0x01 == 0x01 )LCD_WriteData(Color); /* 字符颜色 */elseLCD_WriteData(bkColor); /* 背景颜色 */}}}}/************************************************************** ***************** Function Name : GUI_Chinese* Description : 在指定座标显示字符串* Input : - Xpos: 行座标* - Ypos: 列座标* - str: 字符串* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void GUI_Chinese(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack){do{PutChinese(Xpos,Ypos,str++,Color,bkColor,ack);str++;if ( Xpos < MAX_X - 16 )Xpos += 16;else if ( Ypos < MAX_Y - 16 ){Xpos = 0;Ypos += 16;}else{Xpos = 0;Ypos = 0;}}while(*str!=0);}/************************************************************** ****************** Function Name : LCD_Picture* Description : LCD显示图片* Input : xs,xe,ys,ye* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Picture(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye){uint32_t temp;LCD_Window(xs,xe,ys,ye);for(temp=0;temp<(xe-xs+1)*(ye-ys+1);temp++)LCD_WriteData((win7[2*temp]<<8)+win7[2*temp+1]);}/************************************************************** *******************************************END FILE*************************************************************** ******************************************/。
SSD1289中文手册
SSD12891 概述SSD1289是集成RAM、电源电路、门驱动器、驱动源于一体的TFTLCD驱动控制器。
它最大可驱动分辨率为240×320的26.2万色RGB非晶TFT面板。
SSD1289同样集成了控制功能。
其包括172800字节的图形显示数据区。
因此,通过兼容的并行或串行接口,它可以与像6800及8080系列的8-/9-/16-/18位通用微控制器接口,将数据写入图形显示数据区。
另外,集成辅助的18-/16-/6位的视频接口用于动画图像的显示。
SSD1289嵌入了DC-DC变压器和电压转换器,用于提供芯片驱动所有外部底层元件所必需的电压。
芯片包含的一个通用电压发生电路用于驱动TFT显示器的反电极。
另外还有一个整合的伽马控制电路,用于配合软指令以提供最大的灵活性和最佳的显示效果。
DS1289工作的最低电压能低到1.16V,同时提供不同的节电模式。
它适用于任何需要长时间运行的,用便携式电池驱动的紧凑型设备。
2 特点●工作电压:V DD = 1.65V-1.95V (不规则的逻辑输入)= 1.4V-3.6V (规则的逻辑输入)VDDIO= 2.5V-3.6V (内部模拟电路的电源供应)VCI●最大的门驱动输出电压:30Vp-p●驱动源输出电压:0-5V●低电流睡眠模式和8-color节能显示模式●显示尺寸:240RGB×320●显示颜色支持:26.2万色RGB非晶TFT面板●8/9/16/18位的6800系列/8080系列的并行接口和串行接口●支持动画显示的18位RGB接口(VSYNC, HSYNC, DOTCLK, DEN, and D0-17)●片上172800字节的图形显示数据区●RAM写同步功能●支持线性和帧转换●软件可选中心滚屏、顶部滚屏、底部滚屏和全部滚屏。
●Source and Gate scan direction control●片内电平发生器●片内电压转换器高达6x/-6x●可编程的伽马矫正曲线●对VCOM标准的稳定存储●可编程的公共电极电压幅度和一般结构的Cs水平●支持Cs的门结构●COG包可用3 订购信息4 结构图名字类型功能描述DENinput 显示的时间信号Display enable pin from controller.VSYNC 帧同步信号HSYNC 线性同步信号DOTCLK 点时钟和振荡源SHUTinput 逻辑控制关闭显示引脚,使进入睡眠模式- Connect to V DDIO for sleep mode- Connect to V SS for normal operating modeRLinput 面板映射控制选择源驱动数据的转换方向- Connect to V DDIO for display first RGB data at S0-S2- Connect to V SS for display first RGB data at S719-S717GD 选择第一个输出门- GD = ‘0’, G0 is 1st output Gate, Gate sequence G0, G1, G2, G3, …,G318, G319- GD = ‘1’, G1 is 1st output Gate, Gate sequence G1, G0, G3, G2, …,G319, G318TB 选择驱动门扫描方向- Connect to V DDIO for Gate scan from G0 to G319- Connect to V SS for Gate scan from G319 to G0BGR选择颜色映射- Connect to V DDIO for Blue-Green-Red mapping8 模块功能描述系统接口:系统接口单元由3个功能模块组成,来驱动6800系列的并行接口、8080系列的并行接口、3线串行接口、4线串行接口。
AVR_M128 BootLoader应用范例—AVR,M128,BootLoader,ICCAVR版本,AVR单片机
0x02
#define XMODEM_EOT
0x04
#define XMODEM_ACK
0x06
#define XMODEM_NAK
0x15
#define XMODEM_CAN
0x18
#define XMODEM_EOF
0x1A
#define XMODEM_WAIT_CHAR 'C'
//定义全局变量
}
//主程序
int main(void)
{
unsigned char c;
unsigned char i;
unsigned int crc;
//考虑到BootLoader可能由应用程序中跳转过来,所以所用到的模块需要全面初始化
// DDRA=0x00;
DDRB=0x00;
DDRC=0x00;
// PORTA=0xFF;
//关全局中断
//这个BootLoader没有使用中断。
//初始化USART 115200 8, n,1 PC上位机软件(超级终端)也要设成同样的设置才能通讯
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //异步,8位数据,无奇偶校验,一个停止位,无倍速
UBRRL = (F_CPU/BAUDRATE/16-1)%256;
//将数据填入Flash缓冲页中
{
w =*buf++;
w+=(*buf++)<<8;
//boot_page_fill(FlashAddress+i, w); //原句
boot_page_fill(i, w);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define WR_SET PORTD |= 1<<PD2
#define WR_CLR PORTD &= ~( 1<<PD2 ) //写操作 地有效
#define RD_SET PORTD |= 1<<PD3
#define RD_CLR PORTD &= ~( 1<<PD3 ) //读操作 低有效
0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00,
/*-- 文字: 京 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x02,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,
LCD_Write_Com_Data(0x0003,0xA8A4); delay_ms(1);
LCD_Write_Com_Data(0x000C,0x0000); delay_ms(1);
LCD_Write_Com_Data(0x000D,0x080C); delay_ms(1);
}
unsigned char zimo[] =
{
/*-- 文字: 南 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44,
LCD_Write_Com_Data(0x004e,0); //列首址0
LCD_Write_Com( 0x0022 );
RS_SET;
CS_CLR;
DATA_H = 0xF8;
DATA_L = 0x00;
for(i=0;i<240;i++)
{
LCD_Write_Com( reg );
unsigned int i;
RS_SET; //数据
DDRA = 0x00;
DDRE = 0x00;
CS_CLR;
RD_CLR;
i = PINE; //DATA_H
i <<= 8;
i |= PINA;//DATA_L
void delay_ms( unsigned int n )
{
unsigned int i,j;
unsigned int temp = n * ( F_CPU / 1000000 );
for( i=0;i<temp;i++ )
for( j=0;j<50;j++ );
}
#define CS_CLR PORTD &= ~( 1<<PD0 ) //片选 低电平有效
#define RS_SET PORTD |= 1<<PD1 //高 数据
#define RS_CLR PORTD &= ~( 1<<PD1 ) //低 指令
0x1F,0xF0,0x01,0x00,0x09,0x30,0x19,0x18,0x31,0x0C,0x41,0x08,0x05,0x00,0x02,0x00,
/*-- 文字: 理 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x03,0xFC,0xFA,0x44,0x22,0x44,0x23,0xFC,0x22,0x44,0xFA,0x44,0x23,0xFC,
CS_SET;
}
//写寄存器和数据
void LCD_Write_Com_Data( unsigned int reg, unsigned int value )
{
LCD_Write_Com( reg );
LCD_Write_Data( value );
}
//读数据
unsigned int LCD_Read_Data( unsigned int reg )
//AVR28
//AVR studio 4
//TFT控制驱动器:SSD1289
//程序功能:显示汉字(未做成字库)
#include<avr/io.h>
#define F_CPU 8000000
#define LCD_RESET_0 PORTD &= ~( 1<<PD4 ) //LCD复位
LCD_Write_Com_Data(0x0005,0x0000); delay_ms(1);
LCD_Write_Com_Data(0x0006,0x0000); delay_ms(1);
LCD_Write_Com_Data(0x0016,0xEF1C); delay_ms(1);
LCD_Write_Com_Data(0x0002,0x0600); delay_ms(1);
LCD_Write_Com_Data(0x0010,0x0000); delay_ms(1);
LCD_Write_Com_Data(0x0011,0x6070); delay_ms(1); //0x4030 //定义数据格式 16位色
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00
};
void LCD_Init()
{
LCD_Write_Com_Data(0x0000,0x0001); delay_ms(1); //打开晶振
void AVR128_Init()
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 1<<PB5;
DDRB = 0xFF;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x00;
DDRE = 0xFF;
}
//写寄存器
LCD_Write_Com_Data(0x000E,0x2B00); delay_ms(1);
LCD_Write_Com_Data(0x001E,0x00B0); delay_ms(1);
LCD_Write_Com_Data(0x0001,0x2B3F); delay_ms(1); //驱动输出控制320*240 0x6B3F
}
//写数据
void LCD_Write_Data( unsigned int value )
{
RS_SET; //数据
CS_CLR;
DATA_H = value >> 8;
DATA_L = value;
WR_CLR;
// delay_ms( 1 );
WR_SET;
}
*/
CS_SET;
}
void Set_Cursor( unsigned int X_Pos, unsigned int Y_Pos )
{
LCD_Write_Com_Data( 0x004e, X_Pos ); //列址
LCD_Write_Com_Data( 0x004f, Y_Pos ); //行址
RD_SET;
CS_SET;
DDRA = 0xFF;
DDRE = 0xFF;
return i;
}
void LCD_Clear()
{
unsigned int i,j;
LCD_Write_Com_Data(0x004f,0); //行首址0
for(j=0;j<320;j++)
{
WR_CLR;
WR_SET;
}
/* DATA_H = 0xF8;
DATA_L = 0x00;
for(i=0;i<240;i++)
for(j=0;j<320;j++)
{
WR_CLR;
WR_SET;
void LCD_Write_Com( unsigned int reg )
{
RS_CLR; //指令
CS_CLR;
DATA_H = reg >> 8 ;
DATA_L = reg;
WR_CLR;
// delay_ms( 1 );
WR_SET;
CS_SET;
LCD_Write_Com_Data(0x000F,0x0000); delay_ms(1); //扫描开始地址
LCD_Write_Com_Data(0x0041,0x0000); delay_ms(1);
LCD_Write_Com_Data(0x0042,0x0000); delay_ms(1);
#define LCD_RESET_1 PORTD |= 1<<PD4
#define BL_CNT_0 PORTB &= ~( 1<<PB5 ) //背光 关
#define BL_CNT_1 PORTB |= 1<<PB5 //背光 开
#define CS_SET PORTD |= 1<<PD0