找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2307|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

OLED IIC四腳0.96寸 51單片機匯編程序分享 仿真+實物測試

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1114132 發(fā)表于 2024-4-6 16:26 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這學(xué)期學(xué)的51單片機匯編,清明沒事寫了個OLED的程序,歡迎批評指正。代碼是照著一個c程序抄的,我會放到附件里,用到的資料都會放到附件里,歡迎批評指正。

單片機匯編源程序如下:
  1. SCL BIT P1.0                ;引腳定義
  2. SDA BIT P1.1

  3. ORG 00H
  4.         JMP START                ;跳轉(zhuǎn)到主函數(shù)
  5. ORG 100H
  6. START:
  7.         MOV SP,#30H                ;設(shè)置堆棧指針
  8.         ACALL INIT                ;初始化OLED
  9.         
  10. MAIN:
  11.         ;顯示白屏
  12.         MOV A,#0FFH               
  13.         ACALL FILL
  14.         ;設(shè)置字符串顯示
  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. ;結(jié)束傳輸
  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的數(shù)據(jù)按位傳輸
  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的數(shù)據(jù)作為指令傳出
  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. ;傳輸數(shù)據(jù),將ACC的數(shù)據(jù)作為數(shù)據(jù)傳出
  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的數(shù)據(jù)刷屏,影響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
復(fù)制代碼
實物測試的時候發(fā)現(xiàn)了一些顯示的bug,所以又更新了一下這個帖子,
歡迎批評指正。

屏幕截圖 2024-04-07 205412.png (93.95 KB, 下載次數(shù): 52)

仿真圖

仿真圖

屏幕截圖 2024-04-07 205412.png (112.47 KB, 下載次數(shù): 64)

文件

文件

092613eedd06c70deb2ec666cf2e2da6145707726.jpg (2.51 MB, 下載次數(shù): 52)

實物測試

實物測試

ASM_OLED.rar

1.98 MB, 下載次數(shù): 21, 下載積分: 黑幣 -5

相關(guān)文件

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:126422 發(fā)表于 2024-4-8 12:19 | 只看該作者
請教樓主,C語言怎么轉(zhuǎn)成匯編語言的,謝謝。
回復(fù)

使用道具 舉報

板凳
ID:1114132 發(fā)表于 2024-4-8 12:28 | 只看該作者
lijn 發(fā)表于 2024-4-8 12:19
請教樓主,C語言怎么轉(zhuǎn)成匯編語言的,謝謝。

我是直接看著c寫的匯編,直接抄c語言的邏輯。keil debug 也可以直接看c程序生成的匯編
回復(fù)

使用道具 舉報

地板
ID:311731 發(fā)表于 2024-4-8 15:29 | 只看該作者
樓主匯編基礎(chǔ)扎實,佩服
回復(fù)

使用道具 舉報

5#
ID:1114132 發(fā)表于 2024-4-8 20:07 | 只看該作者
zkn866 發(fā)表于 2024-4-8 15:29
樓主匯編基礎(chǔ)扎實,佩服

也不是了,還是剛?cè)腴T的小白,寫代碼還要經(jīng)?磿。
回復(fù)

使用道具 舉報

6#
ID:1114132 發(fā)表于 2024-4-9 13:07 | 只看該作者
203行開始的代碼還能優(yōu)化一下。
原來:
  1.         MOV A,R1
  2.         ANL A,#0F0H
  3.         SETB C
  4.         RRC A
  5.         RRC A
  6.         RRC A
  7.         RRC A
復(fù)制代碼

優(yōu)化后:
  1.         MOV A,R1
  2.         ANL A,#0F0H
  3.         SWAP A
  4.         ADD A,#10H
復(fù)制代碼
回復(fù)

使用道具 舉報

7#
ID:1001436 發(fā)表于 2024-4-9 16:09 | 只看該作者
lijn 發(fā)表于 2024-4-8 12:19
請教樓主,C語言怎么轉(zhuǎn)成匯編語言的,謝謝。

命令行轉(zhuǎn)換比較方便:
C51.exe oled.c SRC
回復(fù)

使用道具 舉報

8#
ID:126422 發(fā)表于 2024-11-2 11:27 | 只看該作者
21cnsound 發(fā)表于 2024-4-9 16:09
命令行轉(zhuǎn)換比較方便:
C51.exe oled.c SRC

具體講講怎么設(shè)置,可以實現(xiàn),謝謝。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表