单片机的驱动程序
51单片机驱动LCD1602程序设计(C语言)
字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此 HD44780 写 的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型 LCD 通常有 14 条引脚线或 16 条引脚线的 LCD,多出来的 2 条线是背光电源线 VCC(15 脚)和地线 GND(16 脚),其控制原理 与 14 脚的 LCD 完全一样,定义如下表所示:
for(i=0;i<count;i++) {
if (0 == y) x |= 0x80; //当要显示第一行时地址码+0x80; else x |= 0xC0; //在第二行显示是地址码+0xC0; Write_com(x); //发送地址码 Write_dat(*p); //发送要显示的字符编码 x++; p++; }
01110
○■■■○
10001
■○○○■
10001
■○○○■
10001
■○○○■
11111
■■■■■
10001
■○○○■
10001
■○○○■
上图左边的数据就是字模数据,右边就是将左边数据用“○”代表 0,用“■”代表 1。看出是个“A”
字了吗?在文本文件中“A”字的代码是 41H,PC 收到 41H 的代码后就去字模文件中将代表 A 字的
字符型 LCD 的引脚定义
HD44780 内置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是显示数据 RAM,用来寄存 待显示的字符代码。共 80 个字节,其地址和屏幕的对应关系如下表:
也就是说想要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向 DDRAM 的 00H 地址写 入“A”字的代码就行了。但具体的写入是要按 LCD 模块的指令格式来进行的。在 1602 中我们用前 16 个就行了。第二行也一样用前 16 个地址。对应如下:
51单片机+74HC595驱动数码管程序
51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
51单片机驱动ADC0832模数转换程序lcd1602显示
51单片机驱动ADC0832模数转换程序-lcd1602显示/*这个芯应用不多*/#include ;#define uchar unsigned char#define uint unsigned intuchar Chan0Value,Chan1Value;sbit RS=P1^0; //1602各控制脚sbit RW=P1^1;sbit EN=P1^2;sbit Cs0832= P2^0;//0832各控制脚sbit Clk0832= P3^6;sbit Di0832= P3^7;sbit Do0832= P3^7;void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){int i,j;for(i=0;i;>;i;}for(i=0;i<8;i++)//从低到高取一次数{if(Do0832) Dat2|=0x01<<i;Clk0832=1; //下降沿有效Clk0832=0;}Cs0832=1;Di0832=1;Clk0832=1; //数据读取完成,释放所有数据线if(Dat1==Dat2)return Dat1; //校验两次数相等,输出}/*本程序与其他一般程序最大的不同就是要读两次一次从最高位到最低位,一次从最低位到最高位,两次所读值相等即为正常,可以输出*//******************************LCD1602*********** ***************************//*************************lcd1602程序**************************/void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x80);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void writevalue(uchar add,uchar dat) {wr_com(0x80+add);wr_dat(dat);}void zifuchuan(uchar *ch){while(*ch!=0)wr_dat(*ch++);delay1ms(20);}void main(void){lcd_init();while(1){Chan0Value=GetValue0832(0);delay1ms(100);Chan1Value=GetValue0832(1);wr_com(0x80);zifuchuan("Chanal 0:");writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan("Chanal 1:");writevalue(0x40+10,Chan1Value/100+0x30);writevalue(0x40+11,Chan1Value%100/10+0x30); writevalue(0x40+12,Chan1Value%100%10+0x30); delay1ms(1000);}}/*此程序只为调通ADC0832,没有对电压值进行转换要想得到准确电压值,请把Chan0Value和Chan1Value 的值乘以5再除以255即可。
完整的单片机驱动TFT彩屏的程序设计
单片机驱动TFT彩屏的程序设计一种完整的复杂的单片机驱动TFT彩屏的程序设计。
同步显示有星期;温度;时间;遥控指示;以及强大的定时功能…废话不多说,自已向下看吧…显示效果图:彩屏部分数据:(网上有资料,陶宝网上有买)以下是汇编程序:(本程序可直接复制使用,但请指明出处。
)本程序本人用时2. 5个月制作(当然是工作闲余的时候),本程序是本人为学习汇编而编写(为做到“入森而不迷”)。
其已经做过实物测试,除时间不是十分精确外,其它都没有问题(因为问题已经解决了~~)。
遥控码数请参照程序中的以下两个子程序:子程序1:遥控按键处理(码数这里面,很容易找的)子程序2:遥控外部中断处理程序(遥控器不同码数长度也不一样,这里要注意);制作:王永宾;QQ:794576441;Email:*******************;---------------------------------------复制以下------------------------ ---------------------------------;TFT彩屏程序(STC89C52);制作:王永宾;QQ:794576441;Email:*******************LCDRS EQU P2.0LCDRW EQU P2.1LCDRST EQU P2.4;------------------SU00 EQU 30H ;时间字符的地址2440(0-9)SU01 EQU 31HSU10 EQU 32HSU11 EQU 33HSU20 EQU 34HSU21 EQU 35HSU30 EQU 36HSU31 EQU 37HSU40 EQU 38HSU41 EQU 39HSU50 EQU 3AHSU51 EQU 3BHSU60 EQU 3CHSU61 EQU 3DHSU70 EQU 3EHSU71 EQU 3FHSU80 EQU 40HSU81 EQU 41HSU90 EQU 42HSU91 EQU 43H;--------时间寄存器定义----------RR0 EQU 44HRR1 EQU 45HRR2 EQU 46HRR3 EQU 47HRR4 EQU 48HRR5 EQU 49HRR6 EQU 4AHRR7 EQU 4BHSUZR0 EQU 4DH ;星期?字符的地址(日-六)SUZR1 EQU 4EHSUZ10 EQU 4FHSUZ11 EQU 50HSUZ20 EQU 51HSUZ30 EQU 53HSUZ31 EQU 54HSUZ40 EQU 55HSUZ41 EQU 56HSUZ50 EQU 57HSUZ51 EQU 58HSUZ60 EQU 59HSUZ61 EQU 5AHWD1 EQU 5BHWD2 EQU 5CHWD3 EQU 5DHWD4 EQU 5EH;-------星期?寄存器定义------------ RR8 EQU 4CH;定时字符的地址1616(六-日)GUAN0 EQU 60HGUAN1 EQU 61HSL10 EQU 62HSL11 EQU 63HSL20 EQU 64HSL21 EQU 65HSL30 EQU 66HSL31 EQU 67HSL40 EQU 68HSL41 EQU 69HSL50 EQU 6AHSL51 EQU 6BHSL60 EQU 6CHSL61 EQU 6DHSL70 EQU 6EHSL71 EQU 6FH;--------定时寄存器定义---第一组-------RA EQU 70H ;组RAL0 EQU 71H ;时间RAL2 EQU 73HRAL3 EQU 74HRAR0 EQU 75HRAR1 EQU 76HRAR2 EQU 77HRAR3 EQU 78HRA1 EQU 79H ;星期?RA2 EQU 7AHRA3 EQU 7BHRA4 EQU 7CHRA5 EQU 7DHRA6 EQU 7EHRA7 EQU 7FH;TFT彩屏程序(STC89C52);制作:王永宾;QQ:794576441;Email:*******************;===================================;===============开始00\==========ORG 0000HLJMP MAIN0ORG 03HLJMP ITT00 ;外部中断ORG 0BHRETI ;计时中断如果溢出直接ORG 1BHLJMP TI1 ;走时中断;============主程序开始=================; ORG 20HMAIN0:LCALL KAIJI ;开机初始化LCALL CSH0QINGPINGHAI0:JB P3.7,$MOV 24H,#00H ;R4 MOV 25H,#03FH ;R4 MOV 26H,#00HMOV 27H,#03FHMOV R3,#00HMOV R4,#00HLCALL QINGPING QINGPINGHAI1:JNB P3.7,QINGPINGRED0 JNB P3.6,QINGPINGEND AJMP QINGPINGHAI1QINGPINGRED0:JB P3.7,$MOV 24H,#0E0H ;R4 MOV 25H,#0FFH ;R4 MOV 26H,#0E0HMOV 27H,#0FFHMOV R3,#00HMOV R4,#0E0HLCALL QINGPING QINGPINGRED1:JNB P3.7,QINGPINGLV0 JNB P3.6,QINGPINGEND AJMP QINGPINGRED1QINGPINGLV0:JB P3.7,$MOV R1,#00HMOV R2,#03HMOV R3,#10HMOV R4,#0B0HLCALL XML ;写命令LCALL XSJ ;写数据MOV R1,#00HMOV R2,#22HLCALL XML ;写命令MOV 24H,#0C3H ;底MOV 25H,#3FH ;字MOV 26H,#0C3H ;底MOV 27H,#3FH ;字MOV R3,#00HMOV R4,#0C3H ;底LCALL QINGPING QINGPINGLV1:JNB P3.7,QINGPINGHAI0JNB P3.6,QINGPINGENDAJMP QINGPINGLV1;========================= QINGPINGEND:MOV R1,#00HMOV R2,#22HLCALL XML ;写命令LCALL GUDING ;固定字符LCALL WINDU ;温度LCALL YAOKONG ;遥控LJMP XSUMAIN:LCALL DINGSHISHU ;定时数LCALL DINGSHIZU ;定时组LCALL XPX ;星期几LCALL SHIJIAN ;时间LCALL WENDUCHULILCALL WINDU ;温度LCALL TIR0SETB P2.5 ;-----完全相等---关闹CLR P2.6 ;-----完全相等---关闹MAIN1:CLR P2.7LCALL SHIJIAN ;时间LCALL JP0 ;键盘LCALL POWER ;遥控处理;----------------------MOV A,2CHCJNE A,RR3,MAIN2 ;RR3为分计LJMP MAIN3 ;定义十秒锺扫一次温度MAIN2:MOV 2CH,RR3LCALL WENDUCHULI ;温度处理LCALL WINDU ;温度MAIN3:MOV A,RR0 ;分有变动就扫描定时CJNE A,RR4,MAIN4 ;RR4为分LJMP MAIN1MAIN4:MOV RR0,RR4LCALL BIJIAO ;定时比较LJMP MAIN1;=============温度处理====================== WENDUCHULI:LCALL WENDUXS ;读写子程序MOV A,21HMOV R0,#20HXCHD A,@R0ANL A,#0FHMOV 21H,A ;21H小数处理MOV A,20HSWAP A ;20整数处理MOV 20H,AJB 07H,WENDUCHULI1;是负数转MOV WD4,26H ;清除负数标示LCALL WENDUCHULI0 ;写整数个位MOV WD2,ALCALL WENDUCHULI0 ;写整数十位MOV WD1,AMOV A,21H ;写小数位MOV B,#02DIV ABMOV B,AADD A,BADD A,#30HMOV WD3,A ;写小数位RETWENDUCHULI1:;负数处理.....MOV WD4,27H ;负数标示MOV A,20H ;20整数处理CPL A ;取反ANL A,#7FH ;清负数位INC A ;加一MOV 20H,A ;20整数处理MOV A,21H ;21H小数处理CPL A ;取反ANL A,#0FH ;清除高位INC A ;加一MOV 21H,A ;21H小数处理LCALL WENDUCHULI0 ;写整数个位MOV WD2,ALCALL WENDUCHULI0 ;写整数十位MOV WD1,AMOV A,21H ;写小数位MOV B,#02DIV ABMOV B,AADD A,BADD A,#30HMOV WD3,A ;写小数位RET;------------整数写子程序-------- WENDUCHULI0:MOV A,20H ;整数写子程序MOV B,#10DIV ABMOV 20H,AMOV A,BADD A,BADD A,#30H ;整数写子程序RET;======写数据========= WENDUXS:LCALL WENDURSTJB 70H,WENDUXS1 ;检复位成功了转RETWENDUXS1:MOV A,#0CCH ;跳过ROMLCALL WENDUXS_BMOV A,#44HLCALL WENDUXS_B ;RAM温度转换MOV R4,#50D1: ;等待750uS转换完成MOV R5,#13DJNZ R5,$DJNZ R6,D1;======读数据==============LCALL WENDURSTJB 70H,WENDUDS1 ;检复位成功了转RETWENDUDS1:MOV A,#0CCH ;跳过ROMLCALL WENDUXS_BMOV A,#0BEH ;读RAMLCALL WENDUXS_BLCALL WENDUDX_B ;调读子程序RET;-----读数子程序-----------WENDUDX_B:MOV R0,#20HMOV R4,#02WENDUDX_B0:MOV R5,#08HWENDUDX_B1:CLR CSETB P3.3NOPNOPNOPNOPCLR P3.3NOPNOPNOPNOPNOPNOPSETB P3.3MOV R6,#18DJNZ R6,$ ;13uSMOV C,P3.3MOV R6,#46DJNZ R6,$RRC ADJNZ R5,WENDUDX_B1MOV @R0,AINC R0DJNZ R4,WENDUDX_B0RET;====写数据子程序======WENDUXS_B:MOV R5,#08HCLR CWENDUXS_B0:CLR P3.3MOV R6,#12DJNZ R6,$RRC AMOV P3.3,CMOV R6,#49DJNZ R6,$SETB P3.3NOPNOPDJNZ R5,WENDUXS_B0SETB P3.3RET;===========18B20初始化子程序=============== WENDURST:SETB P3.3NOPNOPCLR P3.3MOV R5,#255WENDURST1: ;复位低电时间510uSNOPNOPDJNZ R5,WENDURST1;复位低电时间510uSSETB P3.3MOV R5,#60 ;等待检测存在脉冲15uSDJNZ R5,$ ;等待检测存在脉冲15uSJNB P3.3,WENDURSTOK ;有存在脉冲转CLR 70H ;无存在脉冲清除标号RETWENDURSTOK:MOV R5,#180 ;测存在脉冲240uSDJNZ R5,$SETB 70H ;有存在脉冲打上标号SETB P3.3RET;============遥控按键处理========================== POWER:MOV A,5FHCJNE A,#0B7H,POWER1LCALL YAOKONG1MOV 5FH,#00HRETPOWER1:MOV A,5FHCJNE A,#0A7H,POWER2LCALL YAOKONG2MOV 5FH,#00HRETPOWER2:MOV A,5FHCJNE A,#97H,POWER3LCALL YAOKONG3MOV 5FH,#00HRETPOWER3:MOV A,5FHCJNE A,#0FH,POWER4LCALL YAOKONG4MOV 5FH,#00HRETPOWER4:MOV A,5FHCJNE A,#0C7H,POWER5 LCALL YAOKONG5 MOV 5FH,#00HRETPOWER5:MOV A,5FHCJNE A,#4FH,POWER6 LCALL YAOKONG6 MOV 5FH,#00HRETPOWER6:MOV A,5FHCJNE A,#0E7H,POWER7 LCALL YAOKONG7 MOV 5FH,#00HRETPOWER7:MOV A,5FHCJNE A,#27H,POWER8 LCALL YAOKONG8 MOV 5FH,#00HRETPOWER8:MOV A,5FHCJNE A,#0D7H,POWER9 LCALL YAOKONG9 MOV 5FH,#00HRETPOWER9:MOV A,5FHCJNE A,#47H,POWER0 LCALL YAOKONG0 MOV 5FH,#00H POWER0:RET;====================================== ;=========定时比较==================== BIJIAO:BJ0:MOV A,RR8CJNE A,#4DH,BJ1 ;今天星期一吗?MOV R1,#1EHMOV R0,#10HLCALL BJ00RETBJ1:CJNE A,#4FH,BJ2MOV R1,#18HMOV R0,#10HLCALL BJ00RETBJ2:CJNE A,#51H,BJ3MOV R1,#19HMOV R0,#10HLCALL BJ00RETBJ3:CJNE A,#53H,BJ4MOV R1,#1AHMOV R0,#10HLCALL BJ00RETBJ4:CJNE A,#55H,BJ5MOV R1,#1BHMOV R0,#10HLCALL BJ00RETBJ5:CJNE A,#57H,BJ6MOV R1,#1CHMOV R0,#10HLCALL BJ00RETBJ6:CJNE A,#59H,BJ7MOV R1,#1DHMOV R0,#10HLCALL BJ00RETBJ7:LJMP BIJIAO;=========================BJ00: ;是的MOV R5,#08HBJ001:MOVX A,@R1CJNE A,#60H,BJ01 ;第一组的星期一\开了吗? BJ003:MOV A,R1ADD A,#10HMOV R1,AMOV A,R0ADD A,#10HMOV R0,ADJNZ R5,BJ001RETBJ01:LCALL BJBRAL ;调比较程序INC R0INC R0INC R0INC R0LCALL BJBRAR ;调比较程序DEC R0DEC R0DEC R0DEC R0LJMP BJ003;----------子程序-------------BJBRAL:PUSH 00HMOVX A,@R0CJNE A,RR7,BJRALRET ;RAL0=RR7?,不等返回INC R0MOVX A,@R0CJNE A,RR6,BJRALRET ;RAL1=RR6?,不等返回INC R0MOVX A,@R0CJNE A,RR5,BJRALRET ;RAL2=RR5?,不等返回INC R0MOVX A,@R0CJNE A,RR4,BJRALRET ;RAL3=RR4?,不等返回CLR P2.5 ;-----完全相等---开闹SETB P2.6 ;-----完全相等---开闹LJMP BJRALRETBJBRAR:PUSH 00HMOVX A,@R0CJNE A,RR7,BJRALRET ;RAL0=RR7?,不等返回INC R0MOVX A,@R0CJNE A,RR6,BJRALRET ;RAL1=RR6?,不等返回INC R0MOVX A,@R0CJNE A,RR5,BJRALRET ;RAL2=RR5?,不等返回INC R0MOVX A,@R0CJNE A,RR4,BJRALRET ;RAL3=RR4?,不等返回SETB P2.5 ;-----完全相等---关闹CLR P2.6 ;-----完全相等---关闹BJRALRET:POP 00HRET;======================================== ;=======键盘========================JP0:SETB P3.4SETB P3.5SETB P3.6SETB P3.7JP:JNB P3.4,JP1 ;TEST第一次检查JNB P3.5,JP2 ;ALTEST第一次检查JNB P3.6,SNOOZERET ;返回MAINJP1: ;TEST第二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.4,JP1LJMP TESETJP2: ;ALTEST第二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.5,JP2LJMP ALSETSNOOZE: ;ALTEST第二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.5,SNOOZESETB P2.5CLR P2.6RET;-------TEST处理地址--------------- TESET: ;TEST处理地址LCALL SHIJIAN ;显示时间JNB P3.4,TESETTESET1:MOV R3,#70H ;选定LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.5,XQ0 ;转星期?JNB P3.6,HR0 ;转时JNB P3.7,MIN0 ;转分JNB P3.4,TESETO ;转返回LJMP TESET1 ;重复检查XQ0: ;星期?二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.5,XQ0LJMP XQHR0: ;时二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.6,HRLJMP TESET1MIN0: ;分二次检查LCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.7,MINLJMP TESET1TESETO: ;返回二次检查MOV R3,#00HLCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.4,TESETOLJMP RESXQ: ;星期?处理程序INC RR8INC RR8LCALL XQCJMLJMP TESET1HR: ;时处理程序INC RR6INC RR6LCALL HRCJMLJMP TESET1MIN: ;分处理程序INC RR4INC RR4LCALL MINCJMLJMP TESET1RES:MOV R3,#00H ;取消选定RET ;返回MAIN;------ALTEST处理地址--------------- ALSET: ;ALTEST处理地址LCALL SHIJIANLCALL XPXJNB P3.5,ALSETALSET1:MOV R3,#00HLCALL SHIJIANLCALL XPXMOV R3,#70HMOV 05H,#70HLCALL XRXSLCALL DINGSHISHULCALL DINGSHIZUJNB P3.5,ALSETOJNB P3.4,ALSETRRLL00JNB P3.6,XQZURRLLLJMP ALSET1XQZURRLL:LJMP XQZURRLL00 ALSETO: ;返回二次检查MOV R3,#00HMOV 05H,#00HLCALL SHIJIAN ;显示时间LCALL XPX ;显示星期几JNB P3.5,ALSETO ;返回LJMP ALRESALRES:LCALL DINGSHIZULCALL DINGSHISHU ;定时数RET ;返回MAIN;--------------------------------------ALSETRRLL00: ;返回二次检查LCALL SS50mSJNB P3.4,ALSETRRLL00MOV R3,#00HLCALL DINGSHISHUMOV 05H,#00HLCALL DINGSHIZU ALSETRRLL01:JNB P3.7,ALSETADD00JNB P3.4,ALSETRRLL10MOV R3,#70HLCALL DINGSHISHU12LJMP ALSETRRLL01ALSETADD00:LCALL SS50mSJNB P3.7,ALSETADD01LJMP ALSETRRLL01 ALSETADD01:LCALL DINGSHISHU12INC RAL1INC RAL1MOV A,#34HCJNE A,RAL0,ALSETADD02MOV A,#38HCJNE A,RAL1,ALSETRRLL01 MOV RAL1,#30HMOV RAL0,#30HLJMP ALSETRRLL01ALSETADD02:MOV A,#44HCJNE A,RAL1,ALSETRRLL01 MOV RAL1,#30HINC RAL0INC RAL0LJMP ALSETRRLL01;------------------------------------------- ALSETRRLL10: ;返回二次检查LCALL SS50mSJNB P3.4,ALSETRRLL10MOV R3,#00HLCALL DINGSHISHU ALSETRRLL11:JNB P3.7,ALSETADD10JNB P3.4,ALSETRRLL20MOV R3,#70HLCALL DINGSHISHU34LJMP ALSETRRLL11ALSETADD10:LCALL SS50mSJNB P3.7,ALSETADD11LJMP ALSETRRLL11 ALSETADD11:LCALL DINGSHISHU34INC RAL3INC RAL3MOV A,#44HCJNE A,RAL3,ALSETRRLL11 MOV RAL3,#30HINC RAL2 ;分INC RAL2MOV A,#3CHCJNE A,RAL2,ALSETRRLL11 MOV RAL2,#30HLJMP ALSETRRLL11;------------------------------------- ALSETRRLL20: ;返回二次检查LCALL SS50mSJNB P3.4,ALSETRRLL20MOV R3,#00HLCALL DINGSHISHU ALSETRRLL21:JNB P3.7,ALSETADD20JNB P3.4,ALSETRRLL30MOV R3,#70HLCALL DINGSHISHU56LJMP ALSETRRLL21ALSETADD20:LCALL SS50mSJNB P3.7,ALSETADD21LJMP ALSETRRLL21 ALSETADD21:LCALL DINGSHISHU56INC RAR1INC RAR1MOV A,#34HCJNE A,RAR0,ALSETADD22MOV A,#38HCJNE A,RAR1,ALSETRRLL21 MOV RAR1,#30HMOV RAR0,#30HLJMP ALSETRRLL21ALSETADD22:MOV A,#44HCJNE A,RAR1,ALSETRRLL21MOV RAR1,#30HINC RAR0INC RAR0LJMP ALSETRRLL21;-----------------------------------------ALSETRRLL30: ;返回二次检查LCALL SS50mSJNB P3.4,ALSETRRLL30MOV R3,#00HLCALL DINGSHISHUALSETRRLL31:JNB P3.7,ALSETADD30JNB P3.4,ALSETRRLL40MOV R3,#70HLCALL DINGSHISHU78LJMP ALSETRRLL31ALSETRRLL40:MOV R3,#00HLCALL BCXH;=================保存数值=========== LJMP ALSET1ALSETADD30:LCALL SS50mSJNB P3.7,ALSETADD31LJMP ALSETRRLL31ALSETADD31:LCALL DINGSHISHU78INC RAR3INC RAR3MOV A,#44HCJNE A,RAR3,ALSETRRLL31MOV RAR3,#30HINC RAR2 ;分INC RAR2MOV A,#3CHCJNE A,RAR2,ALSETRRLL31MOV RAR2,#30HLJMP ALSETRRLL31;-----------------?组---------------XQZURRLL00:LCALL SS50mSJNB P3.6,XQZURRLL00;如果为0(不放键)等待MOV R3,#00HLCALL DINGSHISHUMOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL01:MOV R3,#00HMOV 05H,#00HLCALL XRXSLCALL DINGSHIZULCALL DINGSHISHUXQZURRLL011:JNB P3.7,XQZUADD00;按加键加JNB P3.6,XQZURRLL10 ;按RRLL换下一个或返回MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU1 ;选定要调的颜色LJMP XQZURRLL011XQZUADD00:JNB P3.7,XQZUADD00 ;加键有用吗?XQZUADD01: ;有用加一次LCALL DINGSHIZU1INC RAINC RAMOV A,#70HCJNE A,RA,XQZURRLL01MOV RA,#62HLJMP XQZURRLL01;---------------------- 一-------------XQZURRLL10:LCALL SS50mSJNB P3.6,XQZURRLL10;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL11:JNB P3.7,XQZUADD10;按加键加JNB P3.6,XQZURRLL20 ;按RRLL换下一个或返回;================= MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU2 ;选定要调的颜色LJMP XQZURRLL11 ;循环XQZUADD10:JNB P3.7,XQZUADD10 ;加键有用吗?XQZUADD11: ;有用加一次LCALL DINGSHIZU2MOV A,#62HCJNE A,RA1,FG10MOV RA1,#60HLJMP XQZURRLL11FG10:MOV RA1,#62HLJMP XQZURRLL11;--------------- 二XQZURRLL20:LCALL SS50mSJNB P3.6,XQZURRLL20;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL21:JNB P3.7,XQZUADD20;按加键加JNB P3.6,XQZURRLL30 ;按RRLL换下一个或返回;==MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU3 ;选定要调的颜色LJMP XQZURRLL21 ;循环;--------XQZUADD20:JNB P3.7,XQZUADD20 ;加键有用吗?XQZUADD21: ;有用加一次LCALL DINGSHIZU3MOV A,#64HCJNE A,RA2,XQZURRLL210MOV RA2,#60HLJMP XQZURRLL21XQZURRLL210:MOV RA2,#64HLJMP XQZURRLL21;--------------- 三XQZURRLL30:LCALL SS50mSJNB P3.6,XQZURRLL30;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL31:JNB P3.7,XQZUADD30;按加键加JNB P3.6,XQZURRLL40 ;按RRLL换下一个或返回;== MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU4 ;选定要调的颜色LJMP XQZURRLL31 ;循环XQZUADD30:JNB P3.7,XQZUADD30 ;加键有用吗?XQZUADD31: ;有用加一次LCALL DINGSHIZU4MOV A,#66HCJNE A,RA3,XQZURRLL310MOV RA3,#60HLJMP XQZURRLL31XQZURRLL310:MOV RA3,#66HLJMP XQZURRLL31;--------------- 四XQZURRLL40:LCALL SS50mSJNB P3.6,XQZURRLL40;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL41:JNB P3.7,XQZUADD40;按加键加JNB P3.6,XQZURRLL50 ;按RRLL换下一个或返回;== MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU5 ;选定要调的颜色LJMP XQZURRLL41 ;循环XQZUADD40:JNB P3.7,XQZUADD40 ;加键有用吗?XQZUADD41: ;有用加一次LCALL DINGSHIZU5MOV A,#68HCJNE A,RA4,XQZURRLL410MOV RA4,#60HLJMP XQZURRLL41XQZURRLL410:MOV RA4,#68HLJMP XQZURRLL41;--------------- 五XQZURRLL50:LCALL SS50mSJNB P3.6,XQZURRLL50;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL51:JNB P3.7,XQZUADD50;按加键加JNB P3.6,XQZURRLL60 ;按RRLL换下一个或返回;== MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU6 ;选定要调的颜色LJMP XQZURRLL51 ;循环XQZUADD50:JNB P3.7,XQZUADD50 ;加键有用吗?XQZUADD51: ;有用加一次LCALL DINGSHIZU6MOV A,#6AHCJNE A,RA5,XQZURRLL510MOV RA5,#60HLJMP XQZURRLL51XQZURRLL510:MOV RA5,#6AHLJMP XQZURRLL51;--------------- 六XQZURRLL60:LCALL SS50mSJNB P3.6,XQZURRLL60;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL61:JNB P3.7,XQZUADD60;按加键加JNB P3.6,XQZURRLL70 ;按RRLL换下一个或返回;== MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU7 ;选定要调的颜色LJMP XQZURRLL61 ;循环XQZUADD60:JNB P3.7,XQZUADD60 ;加键有用吗?XQZUADD61: ;有用加一次LCALL DINGSHIZU7MOV A,#6CHCJNE A,RA6,XQZURRLL610MOV RA6,#60HLJMP XQZURRLL61XQZURRLL610:MOV RA6,#6CHLJMP XQZURRLL61;--------------- 日XQZURRLL70:LCALL SS50mSJNB P3.6,XQZURRLL70;如果为0(不放键)等待MOV 05H,#00HLCALL DINGSHIZU;清除全部颜色选定XQZURRLL71:JNB P3.7,XQZUADD70;按加键加JNB P3.6,XQZURRLL80 ;按RRLL换下一个或返回;== MOV 05H,#70H ;选定要调的颜色LCALL DINGSHIZU8 ;选定要调的颜色LJMP XQZURRLL71 ;循环XQZURRLL80:LCALL BCXHLJMP ALSET1XQZUADD70:JNB P3.7,XQZUADD70 ;加键有用吗?XQZUADD71: ;有用加一次LCALL DINGSHIZU8MOV A,#6EHCJNE A,RA7,XQZURRLL710MOV RA7,#60HLJMP XQZURRLL71XQZURRLL710:MOV RA7,#6EHLJMP XQZURRLL71;++++++++++++写入显示++++++++++++XRXS:MOV A,#62HCJNE A,RA,XRXS1MOV DPTR,#10HLCALL XRXSBRETXRXS1:MOV A,#64HCJNE A,RA,XRXS2MOV DPTR,#20HLCALL XRXSBRETXRXS2:MOV A,#66HCJNE A,RA,XRXS3MOV DPTR,#30HLCALL XRXSBRETXRXS3:MOV A,#68H CJNE A,RA,XRXS4 MOV DPTR,#40H LCALL XRXSB RETXRXS4:MOV A,#6AH CJNE A,RA,XRXS5 MOV DPTR,#50H LCALL XRXSB RETXRXS5:MOV A,#6CH CJNE A,RA,XRXS6 MOV DPTR,#60H LCALL XRXSB RETXRXS6:MOV A,#6EH CJNE A,RA,XRXS7 MOV DPTR,#70H LCALL XRXSB RETXRXS7:RET;--------------- XRXSB:MOV R0,#71H MOV R6,#0FH XRXSB1:MOVX A,@DPTR MOV @R0,AINC DPTRINC R0DJNZ R6,XRXSB1RET;++++++++保存显示++++++++++++++++ BCXH:MOV A,#62HCJNE A,RA,BCXH1MOV DPTR,#10HLCALL BCXHBRETBCXH1:MOV A,#64HCJNE A,RA,BCXH2MOV DPTR,#20HLCALL BCXHBRETBCXH2:MOV A,#66HCJNE A,RA,BCXH3MOV DPTR,#30HLCALL BCXHBRETBCXH3:MOV A,#68HCJNE A,RA,BCXH4MOV DPTR,#40HLCALL BCXHBRETBCXH4:MOV A,#6AHCJNE A,RA,BCXH5MOV DPTR,#50HLCALL BCXHBRETBCXH5:MOV A,#6CHCJNE A,RA,BCXH6MOV DPTR,#60HLCALL BCXHBRETBCXH6:MOV A,#6EHCJNE A,RA,BCXH7MOV DPTR,#70HLCALL BCXHBRETBCXH7:RET;------------BCXHB:MOV R0,#71HMOV R6,#0FHBCXHB1:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R6,BCXHB1RET;------------TEST累加处理程序-------------- MINCJM:MOV A,#44HCJNE A,RR4,REDMOV RR4,#30HINC RR5 ;分INC RR5MOV A,#3CHCJNE A,RR5,REDRETHRCJM: ;时MOV A,#34HCJNE A,RR7,HRCJM2 MOV A,#38HCJNE A,RR6,HRCJM3 MOV RR6,#30HMOV RR7,#30H HRCJM3:RETHRCJM2:MOV A,#44HCJNE A,RR6,HRCJM3 MOV RR6,#30HINC RR7INC RR7RETXQCJM: ;星期MOV A,#5BHCJNE A,RR8,REDMOV RR8,#4DH RED:MOV R3,#00HRET;-----------中断子程序------ TI1:PUSH 0E0HMOV TL1,#0CHMOV TH1,#04HINC RR1CJNE A,RR1,RESETB P2.7MOV RR1,#00HINC RR2 ;秒1 INC RR2MOV A,#44HCJNE A,RR2,REMOV RR2,#30HINC RR3 ;秒2 INC RR3MOV A,#3CHCJNE A,RR3,REMOV RR3,#30HINC RR4 ;分1 INC RR4MOV A,#44HCJNE A,RR4,REMOV RR4,#30HINC RR5 ;分2 INC RR5MOV A,#3CHCJNE A,RR5,REMOV RR5,#30HINC RR6 ;时1 INC RR6MOV A,#34HCJNE A,RR7,HR2MOV A,#38HCJNE A,RR6,REMOV RR6,#30HMOV RR7,#30HINC RR8INC RR8MOV A,#5BHCJNE A,RR8,REXQXMOV RR8,#4DHLJMP REXQXHR2:MOV A,#44HCJNE A,RR6,REMOV RR6,#30HINC RR7INC RR7RE:POP 0E0HRETIREXQX:LCALL XPX ;星期几POP 0E0HRETI;============遥控外部中断处理程序=================== ITT00: ;外部中断处理程序PUSH 0E0HSETB RS1SETB RS0MOV R6,#0CHITT001:LCALL SS700uSJB P3.2,ITTREDJNZ R6,ITT001MOV TL0,#00H ;计时中断装入MOV TH0,#00HJNB P3.2,$ITT002:MOV R6,#05HITT003:LCALL SS700uSJNB P3.2,ITTREDJNZ R6,ITT003JB P3.2,$MOV R5,TH0MOV TL0,#00H ;计时中断装入MOV A,R5CLR CSUBB A,#32JC ITTREMOV A,R5SUBB A,#38JNC ITTREMOV R7,#04HITT8:MOV R6,#08HITT:LCALL SS700uSJNB P3.2,ITTREJB P3.2,$MOV R5,TH0MOV TL0,#00H ;计时中断装入MOV TH0,#00HMOV A,R5CLR CSUBB A,#06JC XE0XE1:MOV A,R0SETB CRLC AMOV R0,ALJMP ITT1XE0:MOV A,R0CLR CRLC AMOV R0,AITT1:CLR CDJNZ R6,ITTMOV 5FH,R0DJNZ R7,ITT8ITTRE:CLR RS1CLR RS0POP 0E0HRETI;===========地址定义=========================== XSU:;--------时间的地址写入--------MOV DPTR,#LCD24400MOV SU00,DPH ;数字2440-0的MOV SU01,DPLMOV DPTR,#LCD24401MOV SU10,DPH ;数字2440-1的MOV SU11,DPLMOV DPTR,#LCD24402MOV SU20,DPH ;数字2440-2的MOV SU21,DPLMOV DPTR,#LCD24403MOV SU30,DPH ;数字2440-3的MOV SU31,DPLMOV DPTR,#LCD24404MOV SU40,DPH ;数字2440-4的MOV SU41,DPLMOV DPTR,#LCD24405MOV SU50,DPH ;数字2440-5的MOV SU51,DPLMOV DPTR,#LCD24406MOV SU60,DPH ;数字2440-6的MOV SU61,DPLMOV DPTR,#LCD24407MOV SU70,DPHMOV SU71,DPL ;数字2440-7的MOV SU80,DPHMOV SU81,DPL ;数字2440-8的MOV DPTR,#LCD24409MOV SU90,DPH ;数字2440-9的MOV SU91,DPL;----------星期?的地址写入--------------MOV DPTR,#LCD3232RMOV SUZR0,DPH ;星期日的MOV SUZR1,DPLMOV DPTR,#LCD32321MOV SUZ10,DPH ;星期一的MOV SUZ11,DPLMOV DPTR,#LCD32322MOV SUZ20,DPH ;星期二的MOV SUZ21,DPLMOV DPTR,#LCD32323MOV SUZ30,DPH ;星期三的MOV SUZ31,DPLMOV DPTR,#LCD32324MOV SUZ40,DPH ;星期四的MOV SUZ41,DPLMOV DPTR,#LCD32325MOV SUZ50,DPH ;星期五的MOV SUZ51,DPLMOV DPTR,#LCD32326MOV SUZ60,DPH ;星期六的MOV SUZ61,DPL;----------定时星期?的地址写入-------------- MOV DPTR,#LCD1616GMOV GUAN0,DPH ;数字1616-关MOV GUAN1,DPLMOV DPTR,#LCD16161MOV SL10,DPH ;数字1616-一的MOV SL11,DPLMOV DPTR,#LCD16162MOV SL20,DPH ;数字1616-二的MOV SL21,DPLMOV SL30,DPH ;数字1616-三的MOV SL31,DPLMOV DPTR,#LCD16164MOV SL40,DPH ;数字1616-四的MOV SL41,DPLMOV DPTR,#LCD16165MOV SL50,DPH ;数字1616-五的MOV SL51,DPLMOV DPTR,#LCD16166MOV SL60,DPH ;数字1616-六的MOV SL61,DPLMOV DPTR,#LCD1616RMOV SL70,DPH ;数字1616-日的MOV SL71,DPL;=========定义寄出存器地址指定========== ;----------时间的-------------MOV R6,#6MOV R0,#46HCCRR:MOV @R0,#30HINC R0DJNZ R6,CCRR;---------温度的-------------MOV WD1,#30HMOV WD2,#30HMOV WD3,#30HMOV WD4,#3FH;-----------星期?的---------------MOV RR8,#4DH;----------定时的--一组-----------STC:MOV 8EH,#00HMOV DPTR,#10HMOV A,#30HMOV R6,#08MOV R5,#08STC1:MOVX @DPTR,AINC DPTRDJNZ R6,STC1MOV R6,#08MOV A,#60HSTC2:MOVX @DPTR,AINC DPTRDJNZ R6,STC2MOV R6,#08MOV A,#30HDJNZ R5,STC1MOV RAL0,#30H ;左MOV RAL1,#30H ;MOV RAL2,#30H ;MOV RAL3,#30H ;MOV RAR0,#30H ;右MOV RAR1,#30H ;MOV RAR2,#30H ;MOV RAR3,#30H ;MOV RA,#62H ; ;组MOV RA1,#62H ; 一MOV RA2,#64H ; 二MOV RA3,#66H ; 三MOV RA4,#68H ; 四MOV RA5,#6AH ; 五MOV RA6,#6CH ; 六MOV RA7,#6EH ; 日LJMP MAIN;===========中断设定============TIR0:SETB EASETB ET1SETB PT1SETB ET0 ;打开计时中断SETB EX0 ;打开外部中断SETB IT0 ;外部为边沿触发方式SETB TR0 ;开启计时中断MOV TMOD,#19HMOV TL1,#0CHMOV TH1,#04HMOV TL0,#00H ;计时中断装入MOV TH0,#00HSETB TR1RET;==============扫描桌面=========================;======================================================;==============活动字符================================;-------星期--------MOV R1,#00H ;写命高位令数MOV R3,#00H ;写高位数据数MOV R0,#04H ;命令与数据的总数50 51 52 53 20 21 22(22要分开)XPX:MOV DPTR,#LCDK32325 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR8MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL3232RET;---------------------------;----------温度显示--------------------;-------温度左第1位--------WINDU:MOV DPTR,#LCDK24400 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,WD1MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-------温度左第2位--------MOV DPTR,#LCDK24401 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,WD2MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-------温度左第3位--------MOV DPTR,#LCDK24402 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,WD3MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-------温度正负--------MOV DPTR,#LCDK24403 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R4,WD4LCALL WENDULCDLHRET;------------------------------;-----------时间显示-----------------;-----时间--左第1位,时位--------SHIJIAN:LCALL SS5mSMOV DPTR,#LCDK32480 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR7MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-----时间--左第2位,时位--------MOV DPTR,#LCDK32481 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR6MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-----时间--左第3位,分位--------MOV DPTR,#LCDK32482 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR5MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;-----时间--左第4位,分位--------MOV DPTR,#LCDK32483 ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR4MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;------时间--左第5位,秒位--------MOV DPTR,#LCDK2440L ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR3MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440;------时间--左第6位,秒位--------MOV DPTR,#LCDK2440R ;要写的数据与命令组LCALL LCDK ;写命令,与数据MOV R0,RR2MOV DPH,@R0INC R0MOV DPL,@R0LCALL LCDL2440RET;----------------------------------------;---------------遥控彩块-显示------------------;---------遥控彩块--左1位-------------------------- YAOKONG:MOV 2FH,#00HMOV 2EH,#00HLCALL YAOKONG1LCALL YAOKONG2LCALL YAOKONG3LCALL YAOKONG4LCALL YAOKONG5LCALL YAOKONG6LCALL YAOKONG7LCALL YAOKONG8LCALL YAOKONG9LCALL YAOKONG0RET;-------------------YAOKONG1:MOV DPTR,#LCDK24241 ;要写的数据与命令组JNB 7FH,YAOKONG10CLR 7FHSETB P1.0LCALL LCDK ;写命令,与数据LCALL LCDLL ;写红的LCDLLRETYAOKONG10:SETB 7FH。
PIC18单片机LCD液晶显示器驱动程序
//***********************************************//* Main.C *//***********************************************//* W-AP002 MPLAB C18 Advance Workshop *//* Written by: Richard Yang *//* Sr. Corporate Applications Engr.*//* Microchip Technology Inc. *//* Date: 16 January 2003 *//* Revision: 1 *//***********************************************//*********************************************************** #include <p18f452.h>#include <delays.h>#include "P18F_LCD.h"void InitializePORT(void);#pragma idata access My_RAM_1near char LCD_RAM_MSG[ ]="Richard Yang";near unsigned char LCD_Char='0';#pragma romdata RomDataconst rom char LCD_ROM_MSG[ ] ="WAP-002 Workshop";#pragma code//*********************************************************** /* */ /* Main Program */ /* */ //*********************************************************** void main(void){InitializePORT( );OpenLCD( );putcLCD('!');while(1);}//************************************************//* Function: Initialize PORT *//************************************************void InitializePORT(void){PORTA=0x00;TRISA=0b11011011; // RA2 as LCD-E control, RA5 as CS Control for SPIPORTD=0x00;TRISD=0x00; // Set PORTD as Output port}#pragma code#pragma romdata CONFIGconst rom unsigned char CONFIG1L=0xff ; // Don't care byteconst rom unsigned char CONFIG1H=0b00100010 ; // Disable OSC switch , XXXXX010 = HS Oscconst rom unsigned char CONFIG2L=0b00000001 ; // Disable PWRT , Disable BORconst rom unsigned char CONFIG2H=0b00000000 ; // Disable WDT timerconst rom unsigned char CONFIG3L=0xff ; // Don't care byteconst rom unsigned char CONFIG3H=0b00000000 ; // XXXXXXX0 = CCP2 --> RB3const rom unsigned char CONFIG4L=0b00000001 ; // 0XXXXXXX Backgroung Debug Enable ( ICD )const rom unsigned char CONFIG4H=0xff ; // Don't care byteconst rom unsigned char CONFIG5L=0b00001111 ; // Not PROG code protectedconst rom unsigned char CONFIG5H=0b11000000 ; // Not EEPROM code protectedconst rom unsigned char CONFIG6L=0b00001111 ;const rom unsigned char CONFIG6H=0b11100000 ;const rom unsigned char CONFIG7L=0b00001111 ;const rom unsigned char CONFIG7H=0b01000000 ;#pragma romdata// Declaration file for LCD related subroutinesvoid OpenLCD (void) ;void WriteCmdLCD ( unsigned char ) ;void WriteDataLCD( unsigned char ) ;void putsLCD( char * ) ;void putrsLCD( const rom char * ) ;void putcLCD( unsigned char ) ;void puthexLCD( unsigned char ) ;void LCD_Set_Cursor( unsigned char , unsigned char ) ;void LCD_CMD_W_Timing( void ) ;void LCD_L_Delay( void ) ;void LCD_S_Delay( void ) ;void LCD_DAT_W_Timing ( void ) ;#include <p18f452.h>#include <delays.h>#include "P18F_LCD.h"//// Defines for I/O ports that provide LCD data & control// PORTD[0:3]-->DB[4:7]: Higher order 4 lines data bus with bidirectional// : DB7 can be used as a BUSY flag// PORTA,2 --> [E] : LCD operation start signal control// PORTD,5 --> [RW]: LCD Read/Write control// PORTD,4 --> [RS]: LCD Register Select control// : "0" for Instrunction register (Write), Busy Flag (Read) // : "1" for data register (Read/Write)//#define CPU_SPEED 16 // CPU speed is 16 Mhz !!#define LCD_RS PORTDbits.RD4 // The definition of control pins #define LCD_RW PORTDbits.RD5#define LCD_E PORTAbits.RA2#define LCD_DATA LATD // PORTD[0:3] as LCD DB[4:7] //#define LCD_CTRL LATA#define DIR_LCD_DATA TRISD// LCD Module commands#define DISP_2Line_8Bit 0b00111000#define DISP_2Line_4Bit 0b00101000#define DISP_ON 0x00C // Display on#define DISP_ON_C 0x00E // Display on, Cursor on#define DISP_ON_B 0x00F // Display on, Cursor on, Blink cursor#define DISP_OFF 0x008 // Display off#define CLR_DISP 0x001 // Clear the Display#define ENTRY_INC 0x006 //#define ENTRY_INC_S 0x007 //#define ENTRY_DEC 0x004 //#define ENTRY_DEC_S 0x005 //#define DD_RAM_ADDR 0x080 // Least Significant 7-bit are for address#define DD_RAM_UL 0x080 // Upper Left coner of the Display#pragma udataunsigned char Temp_CMD ;unsigned char Str_Temp ;unsigned char Out_Mask ;#pragma codevoid OpenLCD(void){//ADCON1=(ADCON1 & 0xF0)|0b00001110; // Set AN0 for analog inputLCD_E=0;LCD_DATA = 0x00; // LCD DB[4:7] & RS & R/W --> LowDIR_LCD_DA TA = 0x00; // LCD DB[4:7} & RS & R/W are output functionTRISAbits.TRISA2=0; // Set E pin as outputLCD_DATA = 0b00000011 ;LCD_CMD_W_Timing() ;LCD_L_Delay() ;LCD_DATA = 0b00000011 ;LCD_CMD_W_Timing() ;LCD_L_Delay() ;LCD_DATA = 0b00000011 ;LCD_CMD_W_Timing() ;LCD_L_Delay() ;LCD_DATA = 0b00000010 ;LCD_CMD_W_Timing() ;LCD_L_Delay() ;WriteCmdLCD(DISP_2Line_4Bit) ;LCD_S_Delay() ;WriteCmdLCD(DISP_ON) ;LCD_S_Delay() ;WriteCmdLCD(ENTRY_INC) ;LCD_S_Delay() ;WriteCmdLCD(CLR_DISP) ;LCD_L_Delay() ;}//*********************************************// _ ______________________________// RS _>--<______________________________// _____// RW \_____________________________// __________________// E ____________/ \___// _____________ ______// DB _____________>--------------<______//***********************************************// Write Command to LCD module//void WriteCmdLCD( unsigned char LCD_CMD){Temp_CMD = (LCD_CMD & 0xF0)>>4 ; // Send high nibble to LCD bus LCD_DATA= (LCD_DA TA & 0xF0)|Temp_CMD ;LCD_CMD_W_Timing () ;Temp_CMD = LCD_CMD & 0x0F ; // Send low nibble to LCD bus LCD_DATA= (LCD_DA TA & 0xF0)|Temp_CMD ;LCD_CMD_W_Timing () ;LCD_S_Delay() ; // Delay 100uS for execution}//***********************************************// Write Data to LCD module//void WriteDataLCD( unsigned char LCD_CMD){Temp_CMD = (LCD_CMD & 0xF0)>>4 ; // Send high nibble to LCD bus LCD_DATA= (LCD_DA TA & 0xF0)|Temp_CMD ;LCD_DAT_W_Timing () ;Temp_CMD = LCD_CMD & 0x0F ; // Send low nibble to LCD bus LCD_DATA= (LCD_DA TA & 0xF0)|Temp_CMD ;LCD_DAT_W_Timing () ;LCD_S_Delay() ; // Delay 100uS for execution}void putcLCD(unsigned char LCD_Char){WriteDataLCD(LCD_Char) ;}void LCD_CMD_W_Timing( void ){LCD_RS = 0 ; // Set for Command InputNop();// LCD_RW = 0 ;Nop();LCD_E = 1 ;Nop();Nop();LCD_E = 0 ;}void LCD_DAT_W_Timing( void ){LCD_RS = 1 ; // Set for Data InputNop();// LCD_RW = 0 ;Nop();LCD_E = 1 ;Nop();LCD_E = 0 ;}//***********************************************// Set Cursor position on LCD module// CurY = Line (0 or 1)// CurX = Position ( 0 to 15)//void LCD_Set_Cursor(unsigned char CurY, unsigned char CurX) {WriteCmdLCD( 0x80 + CurY * 0x40 + CurX) ;LCD_S_Delay() ;}//***********************************************// Put a ROM string to LCD Module//void putrsLCD( const rom char *Str ){while (1){Str_Temp = *Str ;if (Str_Temp != 0x00 ){WriteDataLCD(Str_Temp) ;Str ++ ;}elsereturn ;}}//***********************************************// Put a RAM string to LCD Module//void putsLCD( char *Str){while (1){Str_Temp = *Str ;if (Str_Temp != 0x00 )WriteDataLCD(Str_Temp) ;Str ++ ;}elsereturn ;}}void puthexLCD(unsigned char HEX_Val){unsigned char Temp_HEX ;Temp_HEX = (HEX_Val >> 4) & 0x0f ;if ( Temp_HEX > 9 )Temp_HEX += 0x37 ;else Temp_HEX += 0x30 ;WriteDataLCD(Temp_HEX) ;Temp_HEX = HEX_Val & 0x0f ;if ( Temp_HEX > 9 )Temp_HEX += 0x37 ;else Temp_HEX += 0x30 ;WriteDataLCD(Temp_HEX) ;}//******************************************************************************* **// Delay for atleast 10 ms//******************************************************************************* **void LCD_L_Delay(void){Delay10KTCYx(CPU_SPEED / 4) ;}//******************************************************************************* **// Delay for 100 us//******************************************************************************* **void LCD_S_Delay(void){Delay100TCYx(CPU_SPEED/4) ;}。
C51单片机实现128细分步进电机驱动程序
Quardrant0, 229, 112,
Quardrant0, 228, 115,
#define PWM2disable(); CCAPM2&=0xBD; //停止P1.5引脚输出PWM
#define PWM3disable(); CCAPM3&=0xBD; //停止P1.6引脚输出PWM
#define PWM4disable(); CCAPM4&=0xBD; //停止P1.7引脚输出PWM
#define MotorPowerOff 0x03 //电机掉电
//定义细分表结构
typedef struct tagSubdivideTable{
unsigned char mQuardrant; //象限0-3
#define PWM4enable(); CCAPM4|=0x42; //配置P1.7引脚为PWM输出
#define PWM0disable(); CCAPM0&=0xBD; //停止P1.3引脚输出PWM
#define PWM1disable(); CCAPM1&=0xBD; //停止P1.4引脚输出PWM
#define CCAP3G 0XFD
#define CCAP4G 0XFE
#define CCAP5G 0XFF
#define CCAP0L 0XEA
#define CCAP1L 0XEB
#define CCAO2L 0XEC
#define CCAP3L 0XED
}WorkInformation;
sbit PhaseA = 0X90^4
sbit PhaseB = 0X90^5
HXD019单片机驱动c程序
if (count_0 >= 10)
//1ms * 1000 -> 1s
{
count_0 = 0;
//reset counter
ReceiveFlag = 1;
}
}
}
void time0_init()
{
TMOD = 0x01;
//16位计数器
TL0 = T1MS;
//初始 timer0 low byte
#define BAUD 9600
//UART baudrate
#define I2CERR_NO_ERROR 0
#define DELAY_TIME 15 //H: 25uS-45uS //第二步:调这个参数和下面的参数,使得每次读写时的SCl时 序如参考图所示:每个bite读写的时间是30us左右;
--------------------------------------------------------------------------------
******************************************************************************
#define DELAY_ST 20
//Hb:18mS-25mS
第一个下降沿和第二个下降沿之间的间隔是20ms左右
//#ifndef UINT8 typedef unsigned char UINT8;
//#endif
//#ifndef UINT16
typedef unsigned int UINT16;
SendData(ReceiveBuf2[i]); 的间隔至少0.8S,这里可以修改
单片机驱动直流电机正反转程序
(1)主程序main.c#include<reg51.h>#include"ds1302.h"sbit Xianwei1=P1^0;sbit Xianwei2=P1^1;sbitMotor_A=P1^2;sbitMotor_B=P1^3;sbitMotor_EN=P1^4;unsigned char Num=0;unsigned intdisp[8]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};/*//---存储顺序是秒分时日月周年,存储格式是用BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};*/void main(){uchar state=0;Motor_A=1;Motor_B=1;Motor_EN=0;Ds1302Init();while(1){Ds1302ReadTime();if((TIME[2]==0x06)&&(TIME[1])==0) //06:00{state++;if(state>2)state=1;}if(state==1){while(Xianwei1!=0){Motor_A=1; //正转Motor_B=0;Motor_EN=1;}}if(state==2){while(Xianwei2!=0){Motor_A=0; //反转Motor_B=1;Motor_EN=1;}}}}(2)ds1302.h#ifndef __DS1302_H_#define __DS1302_H_//---包含头文件---//#include<reg51.h>#include<intrins.h>//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif//---定义ds1302使用的IO口---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);void Ds1302Init();void Ds1302ReadTime();//---加入全局变量--//extern uchar TIME[7]; //加入全局变量(3)ds1302.c#include"ds1302.h"//---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
单片机驱动LCD1602A程序
LCALL WRITE_DATA
RET
;******************************************************************************
;函数名:DISP_CGRAM
;输 入:
;
R5---->自选图形数据个数
;
R4---->自选图形序号
;
R3---->自选图形显示位置
9
嵌入式应用软件园,版权所有,请勿转载/销售。
;调 用:无
;描 述:查询忙碌标志信号
;******************************************************************************
CHECK_BUSY:
PUSH ACC
BUSY_LOOP:
CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_7
CLR E
JB
ACC.7,BUSY_L
;****************************************************************************** ;函数名:WRITE_COM ;输 入:A ;输 出:无 ;调 用:无 ;描 述:写指令到 LCM ;****************************************************************************** WRITE_COM:
;****************************LCM 与 89C51 接口定义******************************
基于51单片机网卡驱动程序
基于单片机网卡驱动程序时间我的网管板使用了网卡芯片接入以太网。
选它的好处是:兼容,软件移植性好;接口简单不用转换芯片如桥;价格便宜$片(我的购入价为元片);带宽充裕(针对);较长一段时间内不会停产。
有种配置模式:跳线方式、即插即用方式、串行配置方式。
为了节省成本,我去掉了而使用作为闪盘存储地址和其他可配置信息。
模式用在机中,这里用不上。
只剩下跳线配置模式可用,它的电路设计参考提供的板图纸。
一天时间就可以完成,相对来说硬件设计比较简单。
与这部分硬件相对应的软件是网卡驱动。
所谓驱动程序是指一组子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供硬件无关接口。
驱动程序可以写成子程序嵌入到应用程序里(如下的端口操作和),也可以放在动态链接库里,用到的时候再动态调入以便节省内存。
在中,为了使、、三种模式的应用程序共存,提出了虚拟机的概念,在的配合下,系统工作在保护模式,接管了、中断、内存访问,应用程序不能直接访问硬件。
这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。
任何网卡驱动都要按或模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如、)、即插即用、电源管理;上层软件一侧要实现规范。
因此在下实现网卡驱动是一件相当复杂的事情。
我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。
从程序员的角度看,工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,会自动把数据包转换成物理帧格式在物理信道上传输。
反之,收到物理信号后将其还原成数据,按指定格式存放在芯片中以便主机程序取用。
简言之就是完成数据包和电信号之间的相互转换:数据包<>电信号。
以太网协议由芯片硬件自动完成,对程序员透明。
驱动程序有种功能:芯片初始化、收包、发包。
以太网协议不止一种,我用的是。
它的帧结构如图所示。
物理信道上的收发操作均使用这个帧格式。
其中,前导序列、帧起始位、校验由硬件自动添加删除,与上层软件无关。
_整套24c16单片机读写驱动程序
用单片机实现通用存贮器IC卡的读写自动化仪表2002本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。
用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。
目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的AT24系列芯片。
以该系列中的AT24C01为例,它具有1k的存贮容量,适用于2V~5V的低电压/标准电压的操作,具有低功耗和高可靠性等优点。
而AT89C2051虽是ATMEL公司89系列单片机的低档型,但它具有2k的FLASH ROM(可重编闪速存贮器)、128×8位内部RAM及全静态操作方式,同样也具有低功耗和较强的功能。
下面以AT24C2051为例,对通用存贮器IC卡的工作原理及基本电路连线作一介绍,该线路简单,使用灵活,能可靠地对通用存贮器IC卡进行读写。
2 硬件特性AT24系列存贮器的特性AT24系列存贮器芯片采用CMOS工艺制造,内置有高压泵,可在单电压供电条件下工作。
其标准封装为8脚DIP封装形式,各引脚的功能说明如下:SCL:串行时钟。
在该脚的上升沿时,系统将数据输入到每个EEPROM器件,在下降沿时输出。
SDA:串行数据。
该引脚为开漏极驱动,可双向传送数据。
A0、A1、A2:器件/页面寻址。
为器件地址输入端。
在AT24C01/02中,该引脚被硬连接。
Vcc:一般输入+5V的工作电压。
图1是符合ISO7816-2标准的IC卡的触点图(见IC卡书P186)。
对于AT24系列通用存贮器IC卡来说,通常只需使用四个触点。
AT24C01的内部组态为128个8位字节,而对随机字寻址则需要一个7位地址。
关于52单片机驱动74HC595控制LCD1602的程序
关于52单片机驱动74HC595控制LCD1602的程序谁能帮忙写个52单片机驱动74hc595控制LCD1602的程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LcdBus P0sbit LED1602_RS=P2^6; //LCD端口定义sbit LED1602_RW=P2^5 ;sbit LED1602_EN=P2^4 ;void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void print_LCD(uchar disp[],uchar num);//延时n ms子程序void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}main(){uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e','','a','t',' ',' '};uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};while(1){LcdIni();WrOp(0x80); //数据指针地址第一行print_LCD(disp1,16);WrOp(0xc0); //第二行print_LCD(disp2,4);delayms(3000);WrOp(0x01);}}/******************************************************************** **********************名称:led1602显示程序模块功能:驱动1602 包括数据口 P1 三个控制口编译:keil作者:孙杰时间:2008-8-9********************************************************************* **********************/void print_LCD(uchar disp[],uchar num) //显示数组disp 显示长度为num {uchar i;for(i=0;i<num;i++){WrDat(disp[i]);delayms(300);}}void LcdIni(){WrOp(0x38);WrOp(0x06); //光标加1WrOp(0x0f); //开显示光标闪烁// WrOp(0x0c); //开显示光标不闪烁}void WrOp(uchar dat){//uchar i;ChkBusy();LED1602_RS=0; //RS=0LED1602_RW=0; //RW=0LED1602_EN=0; //EN=0LcdBus=dat; //送数据LED1602_EN=1; //EN=1delayms(10); //延时LED1602_EN=0; //EN=0}void WrDat(uchar dat){//uchar i;ChkBusy();LED1602_RS=1; //rs=1LED1602_RW=0; //rw=0LED1602_EN=0; //en=0LcdBus=dat; //送数据LED1602_EN=1; //en=1delayms(10);; //延时LED1602_EN=0; //en=0}void ChkBusy(){LED1602_RS=0; //RS=0LED1602_RW=1; //RW=1LED1602_EN=1; //EN=1while(LcdBus&0x80); //送数据LED1602_EN=0; //en=0}74hc595驱动问题#define uc unsigned char#define ui unsigned int#include<iom128v.h>uc Bmp[]={/*------------------------------------------------------------------------------; 源文件 / 文字 :; 宽×高(像素): 64×8; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/64字节; 数据转换日期 : 2009-4-7 11:11:41------------------------------------------------------------------------------*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x40 ,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10 ,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04 ,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01 ,0x01,0x01};uc B1[8]={0};uc B2[8]={0};void delay(ui n) //延时函数{ui j;ui i;for(i=0;i<n;i++)for(j=0;j<20;j++);}void H_B1(uc h) //十六进制转换为二进制,转换后放在数组B1中{B1[7]=h&0x01;B1[6]=h&0x02;B1[5]=h&0x04;B1[4]=h&0x08;B1[3]=h&0x10;B1[2]=h&0x20;B1[1]=h&0x40;B1[0]=h&0x80;}void H_B2(uc h) //十六进制转换为二进制,转换后放在数组B2中{B2[0]=h&0x01;B2[1]=h&0x02;B2[2]=h&0x04;B2[3]=h&0x08;B2[4]=h&0x10;B2[5]=h&0x20;B2[6]=h&0x40;B2[7]=h&0x80;}void print(void) //扫描函数{uc byte=0;uc j=0;uc row=7; //扫第一行uc column;uc bit=0;uc h=0;PORTD=row; //行数赋给PDH_B1(Bmp[0]);while(1){for(row=7;row!=0xff;row--){PORTD=row; //行数赋给PDPORTF=0X00; //给一个扫描点PORTC=0xff;PORTC=0x00;PORTF=0XFF;for(byte=0;byte<8;byte++){H_B1(Bmp[byte+j]);for(bit=0;bit<8;bit++){//delay(2000);PORTC=0xff; //时钟上升沿//delay(1000);if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则74_138输出高阻else {PORTE=0X00; delay(40);}//否则输出低电平PORTF=0XFF; //扫描点后面通通熄灭//delay(2000);PORTC=0x00; //时钟下降沿}PORTG=0Xff;//delay(2000);PORTG=0X00;//bit=0;}j+=8;byte=0;}j=0;}}void main(void){DDRC=0XFF; //PC口为时钟输出DDRD=0XFF; //PD为行选,连74_138的ABC输入端DDRF=0XFF; //PF为列选,扫描点,接74_595的DS端DDRE|=0X80; //PE7为输出,74_138使能控制,低电平有效 DDRG =0Xff;PORTG=0X00;PORTE=0XFF; delay(5000); PORTE=0X00; //开机信号//PORTE=0X00;print();}这是我刚写的一个64*8的点阵扫描程序用74HC595做行选,但是没用锁存,可以显示,但亮度很低。
51单片机驱动16位数码管C语言程序
说明:本程序配合电路为:使用STC89C52、2个74hc138和1个74hc164完成16位数码管的检测任务。
其中74HC164完成数码管段码的输出,2个74HC138完成16个数码管位码的选择。
/*********************************接线关系:P0.0---164(P1、P2) DATP0.1---164(P8) CLKP0.2---138a(P6)GP2.3---138b(P6)G特别说明:本程序位码表所对应74hc138(a、b、c)接线为:P2.2---138(P1) aP2.1---138(P2) bP2.0---138(P3) C*****************************************************/c语言程序如下:#include <reg52.h>#include <absacc.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1sbit DAT_164=P0^0;sbit CLK_164=P0^1;sbit G_138a=P0^2;sbit G_138b=P2^3; //数码管显示开关uchar code seg[]={ //七段码表0x3f,0x06,0x5b,0x4f,0x66,0x6d, //0-5 00H-05H0x7d,0x07,0x7f,0x6f,0x77,0x7c, //6-b 06H-0BH0x39,0x5e,0x79,0x71,0x40,0x46, //c- -1 0CH-11H0x76,0x00,0x80,}; //H 全灭 . 12H-16Hunsigned char code wma3[]={0x00,0x04,0x02,0x06,0x01,0x05,0x03,0x07}; //此为位码表对应于138a-P2.2;138b-P2.1;138c-P2.0。
单片机驱动74HC595的c51程序
单片机驱动74HC595的c51程序//该子程序为74HC595 发送字符的程序,该程序是先发送的是最低位!//芯片74HC595 的时钟引脚为第11 脚//芯片74HC595 的数据引脚为第14 脚//芯片74HC595 的锁存引脚为第12 脚//当有多片74HC595 串联时,只有当所有数据都发送完成后,再锁存信号!//同样74hc164 与51 单片机连接也可以由这个程序来驱动#include#define uchar unsigned char#define uint unsigned int sbit clk=P3 ;sbit dat=P3;sb it shuo_cun=P3;uchar volatile e,f;uchar code tab[]={0x03,/*0*/0x9F,/*1*/0x25,/*2*/0x0D,/*3*/0x99,/*4*/0x49,/*5*/0x41,/*6*/0x1F,/*7*/0x01,/*8*/0x09,/*9*/};void fa_shon(uchar k) //{uchar i; //定义循环变量for(i=0;i8;i++) //因为是1 字节是8 位,所以循环8 次{dat=k0x01; //将要发送的数据与上0X01 送到数据引脚clk=0; //时钟引脚加低电平clk=1; //时钟引脚加高电平k=1; //将发送的数据右移1 位} }void main() {TMOD=0x01;TH0=15535/256;TL0=15535%256;EA=1;ET0=1;TR0=1;while(1){ uchara;for(a=0;a3;a++){fa_shon(tab[e%10]);fa_shon(tab[e%100/10]);fa_shon(tab[e/100]);}s huo_cun=0; //锁存为低电平shuo_cun=1; //锁存为高电平}}void tt()interrupt1{TH0=15535/256;TL0=15535%256;f++;if(f10){f=0;e++;if(e250)e=0;}}tips:感谢大家的阅读,本文由我司收集整编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sck=0; /* bring sck low */
cs=1; /* bring cs high */
wip_poll(); /* poll for completion of a nonvolatile write cycle */
cs=1; /* bring cs high */
return k; /* return k */
}
void wip_poll()
{
char i;
i=0;
clflag0=1;
while((clflag0!=0)&&(i!=80)) /* if WIP bit '1' or i not equal*/
单片机液晶显示驱动程序(用C语言写的)
要求是:RS232接口单片机液晶显示模块PC机上使用串口调试助手的设置如下:
串口设置:波特率9600,无奇偶校验,数据位8位,停止位1位。
发送数据时必须以$开始,无结束字符。如$1234,就可以直接发送。
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
void LCD_SFLine(void);
void LCD_SSLine(void);
void LCD_printf(char lines, char *p);
void ReadLine(char lines, char *p);
void outbyt(char k);
char inbyt(void);
{
sck=0; /* bring sck low */
cs=0; /* bring cs low */
outbyt(k); /* set write enable latch 0x06 */
sck=0; /* set write disable latch 0x04 */
cs=1; /* bring cs high */
sbit si =P1^3;
sbit so =P1^2;
sbit clflag0 =ACC^0;
void CheckBF(void);
void LCD_WtoiR(char datas);
void LCD_WtData(char datas);
void LCD_Clr(void);
void LCD_Init(void);
k=k|so; /* k or so */
/* k shift left one bit */
}
return k; /* return k */
}
/******************************************************/
void wren_cmd(char k) /* set write enable or disable latch */
}
void LCD_printf(char lines, char *p) /*数据输出*/
{
if (lines==1)
LCD_SFLine();
else
LCD_SSLine();
while(*p=='$')
{
while(*p!='\0')
{
LCD_WtData(*p);
p++;
}
}
}
void ReadLine(char lines, char *p) /*读取数据*/
LCD_WtoiR(0x0e); /* (0x0c)?是否显示光标*/
LCD_WtoiR(0x06); /* (0x07)?光标左移或右移*/
}
void LCD_SFLine() /*显示第一行*/
{
LCD_WtoiR(0x80);
}
void LCD_SSLine() /*显示第二行*/
{
LCD_WtoiR(0xc0);
SCON=0x50;
TR1=1;
ES=0;
#include <reg52.h>
#include <absacc.h>
#include <math.h>
sbit RS = P2^5;
sbit RW = P2^6;
sbit Enable = P2^7;
sbit cs =P1^0;
sbit sck =P1^1;
}
/******************************************************/
char rdsr_cmd(void) /* read status register command */
{
char k;
sck=0; /* bring sck low */
cs=0; /* bring cs low */
{
i++;
ACC=rdsr_cmd(); /* read status register */
}
/* to 80 , continus polling */
}
void wrsr_cmd() /* write status register */
{ char k;
sck=0; /* bring sck low */
{
char number,i;
if(lines==1)
{
number=0x80;
LCD_SFLine();
}
else
{
number=0xc0;
LCD_SSLine();
}
for(i=0;i<=19;i++)
{
LCD_WtoiR(number);
CheckBF();
Enable=0;
RS=1;
RW=1;
}
main()
{
char a[20];
LCD_Init();
LCD_Clr();
LCD_printf(1,"1234567"); /*读取第一行数据,在第二行输出*/
ReadLine(1,a);
LCD_printf(2,a);
wrsr_cmd();
while(1)
{
cs=0;
cs=1;
}
}
这是我的不知道对不对还需要补充什么的
char inbyt(void) /* recieves byte from epprom */
{
char i,k;
for(i=0;i<8;i++) /* use i as bit counter to eight */
{
k<<=1;
sck=1; /* bring sck high */
sck=0; /* bring sck low */
k=0x05; /* read status register command byte 0x05 */
outbyt(k); /* send k=0x05 to epprom */
k=inbyt(); /* receieve k from epprom */
sck=0; /* bring sck low */
{
RS=0;
RW=1;
Enable=0;
Enable=1;
flag=P0;
Enable=0;
}
RW=0;
}
void LCD_WtoiR(char datas) /*指令函数*/
{
CheckBF();
Enable=0;
RS=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_WtData(char datas) /*数据写入*/
{
CheckBF();
Enable=0;
RS=1;
RW=0;
Enable=1;
P0=datas;
Enable=0;
}
void LCD_Clr() /*清零*/
{
LCD_WtoiR(1);
}
void LCD_Init() /*初始化*/
{
LCD_WtoiR(0x38); /* (0x3c)?第一行或第二行*/
{
sck=0; /* bring sck low */
si=k&0x80; /* si is always equal to k's highest bit */
sck=1; /* bring sck high */
k<<=1; /* shift data k left 1 */
}
}
/******************************************************/
回答
** 1602A液晶屏驱动程序**晶振频率:11.0592M*****************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void