?? dm12864m串行.lis
字號:
.module dm12864m串行.c
.area text(rom, con, rel)
0000 .dbfile E:\學習專區\AVR專區\個人創作區\AVR單片機開發平臺\EEPROM讀寫演示程序\dm12864m串行.c
0000 .dbfunc e dm12864_inputbyte _dm12864_inputbyte fV
0000 ; mid -> R20
0000 ; i -> R22
0000 ; comm -> R16
.even
0000 _dm12864_inputbyte::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 33
0004 ; /****************************************************************************************
0004 ; LCM(DM12864M-帶字庫,ST7920控制芯片)顯示程序
0004 ;
0004 ; 程序功能:該程序是用AVR來控制對DM12864M
0004 ; 讀寫信號等的操作.
0004 ; 硬件連接:采用串行方式顯示,分配PA.0,PA.1,PA.2
0004 ; 三個I/O口分別作為LCM片選CS,數據SID,時鐘信
0004 ; 號CLK的控制。PA3置為低電平,用來串行選擇信號。
0004 ; PA4置位時開啟背光。
0004 ;
0004 ; ****************************************************************************************/
0004 ;
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #include <stdio.h>
0004 ; #define LCDDDR DDRA
0004 ; #define LCDDDR_IN LCDDDR&=~BIT(PA1);
0004 ; #define LCDDDR_OUT LCDDDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3)|BIT(PA4);
0004 ; /*===============================================================*/
0004 ; #define LCDCTL PORTA
0004 ; #define LCD_RS_H LCDCTL |= BIT(PA0) //片選
0004 ; #define LCD_RS_L LCDCTL &= ~BIT(PA0)
0004 ; #define LCD_RW_H LCDCTL |= BIT(PA1) //數據
0004 ; #define LCD_RW_L LCDCTL &= ~BIT(PA1)
0004 ; #define LCD_EN_H LCDCTL |= BIT(PA2) //時鐘
0004 ; #define LCD_EN_L LCDCTL &= ~BIT(PA2)
0004 ; #define LCD_PSB LCDCTL &= ~BIT(PA3) //串行選擇
0004 ; #define LCD_AK LCDCTL |= BIT(PA4) //開啟背光
0004 ; #define uchar unsigned char
0004 ; /***********************函數體部分*********************************/
0004 ;
0004 ; void dm12864_inputbyte(uchar comm) // 寫入一字節數據
0004 ; {
0004 .dbline 36
0004 ; uchar i;
0004 ; uchar mid;
0004 ; for (i=0;i<8;i++)
0004 6627 clr R22
0006 0AC0 xjmp L5
0008 L2:
0008 .dbline 37
0008 ; {
0008 .dbline 38
0008 ; mid=comm&0x80;
0008 402F mov R20,R16
000A 4078 andi R20,128
000C .dbline 39
000C ; if (mid==0)
000C 11F4 brne L6
000E .dbline 40
000E ; LCD_RW_L ;
000E D998 cbi 0x1b,1
0010 01C0 xjmp L7
0012 L6:
0012 .dbline 42
0012 ; else
0012 ; LCD_RW_H ;
0012 D99A sbi 0x1b,1
0014 L7:
0014 .dbline 43
0014 DA9A sbi 0x1b,2
0016 .dbline 45
0016 DA98 cbi 0x1b,2
0018 .dbline 46
0018 000F lsl R16
001A .dbline 47
001A L3:
001A .dbline 36
001A 6395 inc R22
001C L5:
001C .dbline 36
001C 6830 cpi R22,8
001E A0F3 brlo L2
0020 .dbline -2
0020 L1:
0020 0E940000 xcall pop_gset2
0024 .dbline 0 ; func end
0024 0895 ret
0026 .dbsym r mid 20 c
0026 .dbsym r i 22 c
0026 .dbsym r comm 16 c
0026 .dbend
0026 .dbfunc e dm12864_outputbyte _dm12864_outputbyte fc
0026 ; i -> R16
0026 ; mid -> R18
.even
0026 _dm12864_outputbyte::
0026 .dbline -1
0026 .dbline 50
0026 ; LCD_EN_H ;
0026 ; //delay(15);
0026 ; LCD_EN_L;
0026 ; comm=comm<<1;
0026 ; }
0026 ; }
0026 ; uchar dm12864_outputbyte(void) //讀取一字節數據
0026 ; {
0026 .dbline 51
0026 ; uchar i,mid=0;
0026 2227 clr R18
0028 .dbline 52
0028 ; for (i=0;i<8;i++)
0028 0027 clr R16
002A 0EC0 xjmp L12
002C L9:
002C .dbline 53
002C ; {
002C .dbline 55
002C ; //delay(15);
002C ; LCDDDR_IN;
002C D198 cbi 0x1a,1
002E .dbline 55
002E .dbline 56
002E ; LCD_RS_H ;
002E D89A sbi 0x1b,0
0030 .dbline 57
0030 ; mid=mid<<1;
0030 220F lsl R18
0032 .dbline 58
0032 ; if ((PINA&0x02)==0)
0032 C999 sbic 0x19,1
0034 02C0 rjmp L13
0036 .dbline 59
0036 ; mid&=~BIT(PD0);
0036 2E7F andi R18,254
0038 01C0 xjmp L14
003A L13:
003A .dbline 61
003A ; else
003A ; mid|=BIT(PD0);
003A 2160 ori R18,1
003C L14:
003C .dbline 62
003C 8AB3 in R24,0x1a
003E 8F61 ori R24,31
0040 8ABB out 0x1a,R24
0042 .dbline 62
0042 .dbline 63
0042 DA9A sbi 0x1b,2
0044 .dbline 65
0044 DA98 cbi 0x1b,2
0046 .dbline 66
0046 L10:
0046 .dbline 52
0046 0395 inc R16
0048 L12:
0048 .dbline 52
0048 0830 cpi R16,8
004A 80F3 brlo L9
004C .dbline 67
004C ; LCDDDR_OUT;
004C ; LCD_EN_H ;
004C ; //delay(15);
004C ; LCD_EN_L;
004C ; }
004C ; return(mid);
004C 022F mov R16,R18
004E .dbline -2
004E L8:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbsym r i 16 c
0050 .dbsym r mid 18 c
0050 .dbend
0050 .dbfunc e DetectLCMBusyState _DetectLCMBusyState fV
0050 ; BF -> R20
.even
0050 _DetectLCMBusyState::
0050 0E940000 xcall push_gset1
0054 .dbline -1
0054 .dbline 72
0054 ; }
0054 ;
0054 ; /*-----------------讀取標志位,判斷控制器是否為忙狀態--------------*/
0054 ; void DetectLCMBusyState()
0054 ; {
0054 .dbline 73
0054 ; char BF = 0x00;
0054 4427 clr R20
0056 .dbline 74
0056 ; LCDDDR_OUT;
0056 8AB3 in R24,0x1a
0058 8F61 ori R24,31
005A 8ABB out 0x1a,R24
005C .dbline 74
005C .dbline 75
005C ; LCD_RS_H ;
005C D89A sbi 0x1b,0
005E .dbline 76
005E ; LCD_EN_L ;
005E DA98 cbi 0x1b,2
0060 L16:
0060 .dbline 78
0060 ; do
0060 ; {
0060 .dbline 79
0060 ; dm12864_inputbyte(0xfc);
0060 0CEF ldi R16,252
0062 CEDF xcall _dm12864_inputbyte
0064 .dbline 80
0064 ; BF=dm12864_outputbyte();
0064 E0DF xcall _dm12864_outputbyte
0066 402F mov R20,R16
0068 .dbline 81
0068 L17:
0068 .dbline 81
0068 ; } while(BF==0x80);
0068 4038 cpi R20,128
006A D1F3 breq L16
006C .dbline 82
006C ; LCD_RS_L ;
006C D898 cbi 0x1b,0
006E .dbline 83
006E ; LCD_EN_H ;
006E DA9A sbi 0x1b,2
0070 .dbline -2
0070 L15:
0070 0E940000 xcall pop_gset1
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r BF 20 c
0076 .dbend
0076 .dbfunc e LCMWriteCommand _LCMWriteCommand fV
0076 ; b -> R20
0076 ; a -> R22
0076 ; DisplayCmd -> R20
.even
0076 _LCMWriteCommand::
0076 0E940000 xcall push_gset2
007A 402F mov R20,R16
007C .dbline -1
007C .dbline 89
007C ; //delay(15);
007C ; }
007C ;
007C ; /*----------------------------寫入命令-----------------------------*/
007C ; void LCMWriteCommand(char DisplayCmd)
007C ; {
007C .dbline 91
007C ; uchar a,b;
007C ; a=DisplayCmd&0xf0;
007C 642F mov R22,R20
007E 607F andi R22,240
0080 .dbline 92
0080 ; b=(DisplayCmd<<4)&0xf0;
0080 842F mov R24,R20
0082 8F70 andi R24,#0x0F
0084 8295 swap R24
0086 807F andi R24,240
0088 482F mov R20,R24
008A .dbline 93
008A ; LCDDDR_OUT;
008A 8AB3 in R24,0x1a
008C 8F61 ori R24,31
008E 8ABB out 0x1a,R24
0090 .dbline 93
0090 .dbline 94
0090 ; LCD_RS_H ;
0090 D89A sbi 0x1b,0
0092 .dbline 95
0092 ; LCD_EN_L ;
0092 DA98 cbi 0x1b,2
0094 .dbline 96
0094 ; dm12864_inputbyte(0xf8);
0094 08EF ldi R16,248
0096 B4DF xcall _dm12864_inputbyte
0098 .dbline 97
0098 ; dm12864_inputbyte(a);
0098 062F mov R16,R22
009A B2DF xcall _dm12864_inputbyte
009C .dbline 98
009C ; dm12864_inputbyte(b);
009C 042F mov R16,R20
009E B0DF xcall _dm12864_inputbyte
00A0 .dbline 99
00A0 ; LCD_EN_H ;
00A0 DA9A sbi 0x1b,2
00A2 .dbline 100
00A2 ; LCD_RS_L ;
00A2 D898 cbi 0x1b,0
00A4 .dbline -2
00A4 L19:
00A4 0E940000 xcall pop_gset2
00A8 .dbline 0 ; func end
00A8 0895 ret
00AA .dbsym r b 20 c
00AA .dbsym r a 22 c
00AA .dbsym r DisplayCmd 20 c
00AA .dbend
00AA .dbfunc e LCMWriteData _LCMWriteData fV
00AA ; b -> R20
00AA ; a -> R22
00AA ; DisplayData -> R20
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -