找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 336|回复: 6
收起左侧

OLED IIC四脚0.96寸 51单片机汇编程序分享 仿真+实物测试

[复制链接]
ID:1114132 发表于 2024-4-6 16:26 | 显示全部楼层 |阅读模式
这学期学的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,所以又更新了一下这个帖子,
欢迎批评指正。

仿真图

仿真图

文件

文件

实物测试

实物测试

ASM_OLED.rar

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

相关文件

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:126422 发表于 2024-4-8 12:19 | 显示全部楼层
请教楼主,C语言怎么转成汇编语言的,谢谢。
回复

使用道具 举报

ID:1114132 发表于 2024-4-8 12:28 | 显示全部楼层
lijn 发表于 2024-4-8 12:19
请教楼主,C语言怎么转成汇编语言的,谢谢。

我是直接看着c写的汇编,直接抄c语言的逻辑。keil debug 也可以直接看c程序生成的汇编
回复

使用道具 举报

ID:311731 发表于 2024-4-8 15:29 | 显示全部楼层
楼主汇编基础扎实,佩服
回复

使用道具 举报

ID:1114132 发表于 2024-4-8 20:07 | 显示全部楼层
zkn866 发表于 2024-4-8 15:29
楼主汇编基础扎实,佩服

也不是了,还是刚入门的小白,写代码还要经常看书。
回复

使用道具 举报

ID:1114132 发表于 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
复制代码
回复

使用道具 举报

ID:1001436 发表于 2024-4-9 16:09 | 显示全部楼层
lijn 发表于 2024-4-8 12:19
请教楼主,C语言怎么转成汇编语言的,谢谢。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表