标题: OLED IIC四脚0.96寸 51单片机汇编程序分享 仿真+实物测试 [打印本页]

作者: SkylarGattino    时间: 2024-4-6 16:26
标题: OLED IIC四脚0.96寸 51单片机汇编程序分享 仿真+实物测试
这学期学的51单片机汇编,清明没事写了个OLED的程序,欢迎批评指正。代码是照着一个c程序抄的,我会放到附件里,用到的资料都会放到附件里,欢迎批评指正。

单片机汇编源程序如下:
  1. SCL BIT P1.0                ;引脚定义
  2. SDA BIT P1.1

  3. ORG 00H
  4.         JMP START                ;跳转到主函数
  5. ORG 100H
  6. START:
  7.         MOV SP,#30H                ;设置堆栈指针
  8.         ACALL INIT                ;初始化OLED
  9.         
  10. MAIN:
  11.         ;显示白屏
  12.         MOV A,#0FFH               
  13.         ACALL FILL
  14.         ;设置字符串显示
  15.         MOV R1,#10                ;字符串列起始位置,单位:像素
  16.         MOV R0,#2H                ;字符串行起始位置,单位:行(共0-7,8行)
  17.         MOV R2,#72                ;字符串长度,单位:像素
  18.         MOV DPTR,#PIC        ;传入图像地址
  19.         ACALL SHOW
  20.         ;暂停程序
  21.         JMP $

  22. INIT:
  23.         ;Write_IIC_Command(0xAE);   //display off
  24.         MOV A,#0AEH
  25.         ACALL TRANS_CMD
  26.         ;Write_IIC_Command(0x20);        //Set Memory Addressing Mode        
  27.         MOV A,#20H
  28.         ACALL TRANS_CMD
  29.         ;Write_IIC_Command(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  30.         MOV A,#10H
  31.         ACALL TRANS_CMD
  32.         ;Write_IIC_Command(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  33.         MOV A,#0B0H
  34.         ACALL TRANS_CMD
  35.         ;Write_IIC_Command(0xc8);        //Set COM Output Scan Direction
  36.         MOV A,#0C8H
  37.         ACALL TRANS_CMD
  38.         ;Write_IIC_Command(0x00);//---set low column address
  39.         MOV A,#00H
  40.         ACALL TRANS_CMD
  41.         ;Write_IIC_Command(0x10);//---set high column address
  42.         MOV A,#10H
  43.         ACALL TRANS_CMD
  44.         ;Write_IIC_Command(0x40);//--set start line address
  45.         MOV A,#40H
  46.         ACALL TRANS_CMD
  47.         ;Write_IIC_Command(0x81);//--set contrast control register
  48.         MOV A,#81H
  49.         ACALL TRANS_CMD
  50.         ;Write_IIC_Command(0xdf);
  51.         MOV A,#0DFH
  52.         ACALL TRANS_CMD
  53.         ;Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
  54.         MOV A,#0A1H
  55.         ACALL TRANS_CMD
  56.         ;Write_IIC_Command(0xa6);//--set normal display
  57.         MOV A,#0A6H
  58.         ACALL TRANS_CMD
  59.         ;Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
  60.         MOV A,#0A8H
  61.         ACALL TRANS_CMD
  62.         ;Write_IIC_Command(0x3F);//
  63.         MOV A,#3FH
  64.         ACALL TRANS_CMD
  65.         ;Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  66.         MOV A,#0A4H
  67.         ACALL TRANS_CMD
  68.         ;Write_IIC_Command(0xd3);//-set display offset
  69.         MOV A,#0D3H
  70.         ACALL TRANS_CMD
  71.         ;Write_IIC_Command(0x00);//-not offset
  72.         MOV A,#00H
  73.         ACALL TRANS_CMD
  74.         ;Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
  75.         MOV A,#0D5H
  76.         ACALL TRANS_CMD
  77.         ;Write_IIC_Command(0xf0);//--set divide ratio
  78.         MOV A,#0F0H
  79.         ACALL TRANS_CMD
  80.         ;Write_IIC_Command(0xd9);//--set pre-charge period
  81.         MOV A,#0D9H
  82.         ACALL TRANS_CMD
  83.         ;Write_IIC_Command(0x22); //
  84.         MOV A,#22H
  85.         ACALL TRANS_CMD
  86.         ;Write_IIC_Command(0xda);//--set com pins hardware configuration
  87.         MOV A,#0DAH
  88.         ACALL TRANS_CMD
  89.         ;Write_IIC_Command(0x12);
  90.         MOV A,#12H
  91.         ACALL TRANS_CMD
  92.         ;Write_IIC_Command(0xdb);//--set vcomh
  93.         MOV A,#0DBH
  94.         ACALL TRANS_CMD
  95.         ;Write_IIC_Command(0x20);//0x20,0.77xVcc
  96.         MOV A,#20H
  97.         ACALL TRANS_CMD
  98.         ;Write_IIC_Command(0x8d);//--set DC-DC enable
  99.         MOV A,#8DH
  100.         ACALL TRANS_CMD
  101.         ;Write_IIC_Command(0x14);//
  102.         MOV A,#14H
  103.         ACALL TRANS_CMD
  104.         ;Write_IIC_Command(0xaf);//--turn on oled panel
  105.         MOV A,#0AFH
  106.         ACALL TRANS_CMD
  107.         RET
  108.         
  109. ;开始传输
  110. START_TRANS:
  111.         SETB SCL
  112.         SETB SDA
  113.         CLR SDA
  114.         CLR SCL
  115.         RET
  116.         
  117. ;结束传输
  118. CLOSE_TRANS:
  119.         CLR SCL
  120.         CLR SDA
  121.         SETB SCL
  122.         SETB SDA
  123.         CLR SDA
  124.         CLR SCL
  125.         RET

  126. ;传输,影响R0,ACC寄存器,将ACC的数据按位传输
  127. TRANS:
  128.         MOV R0,#8H
  129. TRA1:
  130.         RLC A
  131.         MOV SDA,C
  132.         SETB SCL
  133.         CLR SCL
  134.         DJNZ R0,TRA1
  135.         SETB SDA
  136.         SETB SCL
  137.         CLR SCL
  138.         RET
  139.         
  140. ;传输指令,将ACC的数据作为指令传出
  141. TRANS_CMD:
  142.         PUSH ACC
  143.         ACALL START_TRANS
  144.         MOV A,#78H
  145.         ACALL TRANS
  146.         MOV A,#00H
  147.         ACALL TRANS
  148.         POP ACC
  149.         ACALL TRANS
  150.         ACALL CLOSE_TRANS
  151.         RET
  152.         
  153. ;传输数据,将ACC的数据作为数据传出
  154. TRANS_DATA:
  155.         PUSH ACC
  156.         ACALL START_TRANS
  157.         MOV A,#78H
  158.         ACALL TRANS
  159.         MOV A,#40H
  160.         ACALL TRANS
  161.         POP ACC
  162.         ACALL TRANS
  163.         ACALL CLOSE_TRANS
  164.         RET
  165.         
  166. ;将ACC的数据刷屏,影响ACC,R0,R1,R2寄存器
  167. FILL:
  168.         PUSH ACC
  169.         MOV A,#8H
  170. FILL1:
  171.         MOV R0,#0B0H
  172.         DEC A
  173.         MOV R2,A
  174.         ADD A,R0
  175.         ACALL TRANS_CMD
  176.         MOV A,#0H
  177.         ACALL TRANS_CMD
  178.         MOV A,#10H
  179.         ACALL TRANS_CMD
  180.         MOV R1,#128
  181. FILL2:
  182.         POP ACC
  183.         PUSH ACC
  184.         ACALL TRANS_DATA
  185.         DJNZ R1,FILL2
  186.         MOV A,R2
  187.         JNZ FILL1
  188.         DEC SP
  189.         RET

  190. ;将指定的图像显示到指定位置,R0:指定行,R1:指定列,R2:图像长度,DPTR:图像位置
  191. SHOW:
  192.         DEC R0
  193.         MOV A,#0B0H
  194.         ADD A,R0
  195.         ACALL TRANS_CMD
  196.         MOV A,R1
  197.         ANL A,#0FH
  198.         ACALL TRANS_CMD
  199.         MOV A,R1
  200.         ANL A,#0F0H
  201.         SETB C
  202.         RRC A
  203.         RRC A
  204.         RRC A
  205.         RRC A
  206.         ACALL TRANS_CMD
  207. SHOW1:
  208.         CLR A
  209.         MOVC A,@A+DPTR
  210.         ACALL TRANS_DATA
  211.         INC DPTR
  212.         DJNZ R2,SHOW1
  213.         RET

  214. ;图像
  215. PIC:
  216. DB 2EH ,4AH ,4AH ,32H ,00H ,00H ,00H ,00H;"5",0
  217. DB 00H ,42H ,7EH ,40H ,00H ,00H ,00H ,00H;"1",1
  218. DB 42H ,7EH ,10H ,52H ,7EH ,42H ,00H ,00H;"H",2
  219. DB 42H ,7EH ,52H ,52H ,46H ,20H ,00H ,00H;"E",3
  220. DB 42H ,7EH ,42H ,00H ,00H ,00H ,00H ,00H;"I",4
  221. DB 00H ,40H ,00H ,00H ,00H ,00H ,00H ,00H;".",5
  222. DB 18H ,24H ,42H ,42H ,24H ,00H ,00H ,00H;"C",6
  223. DB 18H ,24H ,42H ,42H ,24H ,18H ,00H ,00H;"O",7
  224. DB 42H ,7EH ,0CH ,70H ,10H ,4CH ,7EH ,42H;"M",8

  225. END
复制代码
实物测试的时候发现了一些显示的bug,所以又更新了一下这个帖子,
欢迎批评指正。

屏幕截图 2024-04-07 205412.png (93.95 KB, 下载次数: 52)

仿真图

仿真图

屏幕截图 2024-04-07 205412.png (112.47 KB, 下载次数: 64)

文件

文件

092613eedd06c70deb2ec666cf2e2da6145707726.jpg (2.51 MB, 下载次数: 52)

实物测试

实物测试

ASM_OLED.rar

1.98 MB, 下载次数: 21, 下载积分: 黑币 -5

相关文件


作者: lijn    时间: 2024-4-8 12:19
请教楼主,C语言怎么转成汇编语言的,谢谢。
作者: SkylarGattino    时间: 2024-4-8 12:28
lijn 发表于 2024-4-8 12:19
请教楼主,C语言怎么转成汇编语言的,谢谢。

我是直接看着c写的汇编,直接抄c语言的逻辑。keil debug 也可以直接看c程序生成的汇编
作者: zkn866    时间: 2024-4-8 15:29
楼主汇编基础扎实,佩服
作者: SkylarGattino    时间: 2024-4-8 20:07
zkn866 发表于 2024-4-8 15:29
楼主汇编基础扎实,佩服

也不是了,还是刚入门的小白,写代码还要经常看书。
作者: SkylarGattino    时间: 2024-4-9 13:07
203行开始的代码还能优化一下。
原来:
  1.         MOV A,R1
  2.         ANL A,#0F0H
  3.         SETB C
  4.         RRC A
  5.         RRC A
  6.         RRC A
  7.         RRC A
复制代码

优化后:
  1.         MOV A,R1
  2.         ANL A,#0F0H
  3.         SWAP A
  4.         ADD A,#10H
复制代码

作者: 21cnsound    时间: 2024-4-9 16:09
lijn 发表于 2024-4-8 12:19
请教楼主,C语言怎么转成汇编语言的,谢谢。

命令行转换比较方便:
C51.exe oled.c SRC

作者: lijn    时间: 2024-11-2 11:27
21cnsound 发表于 2024-4-9 16:09
命令行转换比较方便:
C51.exe oled.c SRC

具体讲讲怎么设置,可以实现,谢谢。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1