用汇编写了那么多程序,马上就要用C了,所以做一个我近期在单片机上用汇编写代码的心得和一些自认为有用的程序。主要是近期自学过的模块,比如protues中的AMPIRE128X64—LCD,DS18B20—温度测量模块,DS1302—时钟芯片。好啦,废话也不多说了,注意我是按照我写程序的规范来写的,不过很容易理解,我也希望能帮助更多的单片机爱好者。AMPIRE128X64一、Protues上LCD与单片机相连如图:二、打开keil新建一个AT89C51单片机的工程。,方便调用。。如果想知道这款LCD的详细信息可去百度文库搜索。三、,有详细解说。PUBLICDISPLAY_BMP,DISPLAY_LCD,CLEAR_SCREEN,CHEC_BUSY,WRITE_IR,WRITE_DR,INIT_LCD,SELECT_SCREEN,SET_LINE;以上是声明外部调用语句,后面的子程序可被本工程的其它文件调用CODE_12864 SEGMENT CODE ;声明代码段LCD_RS BIT BIT BIT BIT ;低电平有效,左半屏LCD_CS2 BIT ;低电平有效,右半屏ZIMO_NUM EQU 37H ;取字模的大小数;;;;;;;;;;;;;;;;;;;;;;;;;RSEG CODE_12864;;;;;;;;;;;;;;;;;;;;;;;;;检查忙等待CHEC_BUSY: MOV P0,#00H ;;;;;;;;;;;;;;;; CLR LCD_RS SETB LCD_RW SETB LCD_E;详细资料里有这种命令;;;;;;;;;;;;;;;后面的就不细说了 JB ,$ CLR LCD_E RET;;;;;;;;;;;;;;;;;;;;;;;;;向指令寄存器传送指令,传送参数为AWRITE_IR: LCALL CHEC_BUSY CLR LCD_RS CLR LCD_RW MOV P0,A ;P0作为数据口 SETB LCD_E NOP NOP CLR LCD_E RET;;;;;;;;;;;;;;;;;;;;;;;;;向数据寄存器传送指令,传送参数为AWRITE_DR: LCALL CHEC_BUSY SETB LCD_RS CLR LCD_RW MOV P0,A SETB LCD_E NOP NOP CLR LCD_E RET;;;;;;;;;;;;;;;;;;;;;;;;;设置"页"LCD12864共8页,一页是8行点阵点SET_PAGE: ORL A,#0B8H ;页的首地址为0xB8 LCALL WRITE_IR RET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的起始行SET_LINE: ORL A,#0C0H;起始行地址为0xC0 LCALL WRITE_IR;设置从哪行开始:共0--63;一般从0行开始显示 RET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的列SET_COLUMN: ANL A,#3FH;列的最大值为64 ORL A,#40H;列的首地址为0x40 LCALL WRITE_IR;规定显示的列的位置 RET;;;;;;;;;;;;;;;;;;;;;;;;;显示开关函数:0x3E是关显示,0x3F是开显示SET_ON_OFF: ORL A,#3EH;0011111x,onoff只能为0或者1 LCALL WRITE_IR RET ;;;;;;;;;;;;;;;;;;;;;;;;;选择屏幕SELECT_SCREEN: CJNE A,#0,SELECTN0 ;0全屏 CLR LCD_CS1 CLR LCD_CS2 LJMP SELECT_ENDSELECTN0: CJNE A,#1,SELECTN1 ;1左半屏 CLR LCD_CS1 SETB LCD_CS2 LJMP SELECT_ENDSELECTN1: CJNE A,#2,SELECT_END ;2右半屏 CLR LCD_CS2 SETB LCD_CS1 SELECT_END: RET;;;;;;;;;;;;;;;;;;;;;;;;;清屏函数CLEAR_SCREEN: LCALL SELECT_SCREEN;0--全屏;1---左半屏;2---右半屏 MOV R7,#0;控制页数0-7,共8页CLR_K1: MOV A,R7 LCALL SET_PAGE MOV A,#0 LCALL SET_COLUMN MOV R6,#0 ;控制列数0-63,共64列 CLR A ;0CLR_K0: LCALL WRITE
单片机12864LCD、DS1302、DS18B20 来自淘豆网m.daumloan.com转载请标明出处.