這學期學的51單片機匯編,清明沒事寫了個OLED的程序,歡迎批評指正。代碼是照著一個c程序抄的,我會放到附件里,用到的資料都會放到附件里,歡迎批評指正。
單片機匯編源程序如下:- SCL BIT P1.0 ;引腳定義
- SDA BIT P1.1
- ORG 00H
- JMP START ;跳轉到主函數
- ORG 100H
- START:
- MOV SP,#30H ;設置堆棧指針
- ACALL INIT ;初始化OLED
-
- MAIN:
- ;顯示白屏
- MOV A,#0FFH
- ACALL FILL
- ;設置字符串顯示
- MOV R1,#10 ;字符串列起始位置,單位:像素
- MOV R0,#2H ;字符串行起始位置,單位:行(共0-7,8行)
- MOV R2,#72 ;字符串長度,單位:像素
- MOV DPTR,#PIC ;傳入圖像地址
- ACALL SHOW
- ;暫停程序
- JMP $
- INIT:
- ;Write_IIC_Command(0xAE); //display off
- MOV A,#0AEH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x20); //Set Memory Addressing Mode
- MOV A,#20H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
- MOV A,#10H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
- MOV A,#0B0H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xc8); //Set COM Output Scan Direction
- MOV A,#0C8H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x00);//---set low column address
- MOV A,#00H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x10);//---set high column address
- MOV A,#10H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x40);//--set start line address
- MOV A,#40H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x81);//--set contrast control register
- MOV A,#81H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xdf);
- MOV A,#0DFH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
- MOV A,#0A1H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xa6);//--set normal display
- MOV A,#0A6H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
- MOV A,#0A8H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x3F);//
- MOV A,#3FH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
- MOV A,#0A4H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xd3);//-set display offset
- MOV A,#0D3H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x00);//-not offset
- MOV A,#00H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
- MOV A,#0D5H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xf0);//--set divide ratio
- MOV A,#0F0H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xd9);//--set pre-charge period
- MOV A,#0D9H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x22); //
- MOV A,#22H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xda);//--set com pins hardware configuration
- MOV A,#0DAH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x12);
- MOV A,#12H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xdb);//--set vcomh
- MOV A,#0DBH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x20);//0x20,0.77xVcc
- MOV A,#20H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x8d);//--set DC-DC enable
- MOV A,#8DH
- ACALL TRANS_CMD
- ;Write_IIC_Command(0x14);//
- MOV A,#14H
- ACALL TRANS_CMD
- ;Write_IIC_Command(0xaf);//--turn on oled panel
- MOV A,#0AFH
- ACALL TRANS_CMD
- RET
-
- ;開始傳輸
- START_TRANS:
- SETB SCL
- SETB SDA
- CLR SDA
- CLR SCL
- RET
-
- ;結束傳輸
- CLOSE_TRANS:
- CLR SCL
- CLR SDA
- SETB SCL
- SETB SDA
- CLR SDA
- CLR SCL
- RET
- ;傳輸,影響R0,ACC寄存器,將ACC的數據按位傳輸
- TRANS:
- MOV R0,#8H
- TRA1:
- RLC A
- MOV SDA,C
- SETB SCL
- CLR SCL
- DJNZ R0,TRA1
- SETB SDA
- SETB SCL
- CLR SCL
- RET
-
- ;傳輸指令,將ACC的數據作為指令傳出
- TRANS_CMD:
- PUSH ACC
- ACALL START_TRANS
- MOV A,#78H
- ACALL TRANS
- MOV A,#00H
- ACALL TRANS
- POP ACC
- ACALL TRANS
- ACALL CLOSE_TRANS
- RET
-
- ;傳輸數據,將ACC的數據作為數據傳出
- TRANS_DATA:
- PUSH ACC
- ACALL START_TRANS
- MOV A,#78H
- ACALL TRANS
- MOV A,#40H
- ACALL TRANS
- POP ACC
- ACALL TRANS
- ACALL CLOSE_TRANS
- RET
-
- ;將ACC的數據刷屏,影響ACC,R0,R1,R2寄存器
- FILL:
- PUSH ACC
- MOV A,#8H
- FILL1:
- MOV R0,#0B0H
- DEC A
- MOV R2,A
- ADD A,R0
- ACALL TRANS_CMD
- MOV A,#0H
- ACALL TRANS_CMD
- MOV A,#10H
- ACALL TRANS_CMD
- MOV R1,#128
- FILL2:
- POP ACC
- PUSH ACC
- ACALL TRANS_DATA
- DJNZ R1,FILL2
- MOV A,R2
- JNZ FILL1
- DEC SP
- RET
- ;將指定的圖像顯示到指定位置,R0:指定行,R1:指定列,R2:圖像長度,DPTR:圖像位置
- SHOW:
- DEC R0
- MOV A,#0B0H
- ADD A,R0
- ACALL TRANS_CMD
- MOV A,R1
- ANL A,#0FH
- ACALL TRANS_CMD
- MOV A,R1
- ANL A,#0F0H
- SETB C
- RRC A
- RRC A
- RRC A
- RRC A
- ACALL TRANS_CMD
- SHOW1:
- CLR A
- MOVC A,@A+DPTR
- ACALL TRANS_DATA
- INC DPTR
- DJNZ R2,SHOW1
- RET
- ;圖像
- PIC:
- DB 2EH ,4AH ,4AH ,32H ,00H ,00H ,00H ,00H;"5",0
- DB 00H ,42H ,7EH ,40H ,00H ,00H ,00H ,00H;"1",1
- DB 42H ,7EH ,10H ,52H ,7EH ,42H ,00H ,00H;"H",2
- DB 42H ,7EH ,52H ,52H ,46H ,20H ,00H ,00H;"E",3
- DB 42H ,7EH ,42H ,00H ,00H ,00H ,00H ,00H;"I",4
- DB 00H ,40H ,00H ,00H ,00H ,00H ,00H ,00H;".",5
- DB 18H ,24H ,42H ,42H ,24H ,00H ,00H ,00H;"C",6
- DB 18H ,24H ,42H ,42H ,24H ,18H ,00H ,00H;"O",7
- DB 42H ,7EH ,0CH ,70H ,10H ,4CH ,7EH ,42H;"M",8
- END
復制代碼 實物測試的時候發現了一些顯示的bug,所以又更新了一下這個帖子,歡迎批評指正。
|