搜索
bottom↓
回复: 8

go语言开发f1c100s之oled驱动

[复制链接]

出0入0汤圆

发表于 2020-4-4 14:43:45 | 显示全部楼层 |阅读模式
尝试用go语言操作gpio驱动oled,驱动方式是spi,io操作方式是文件方式。由于这种方式需要不断写文件,oled刷新有点慢。后期会改成mmap方式。
oled_spi的github
oled驱动:
  1. package oled

  2. import (
  3.         "oled_spi/gpio"
  4.         "time"
  5. )

  6. const (
  7.         OLED_CLK = "gpio131"
  8.         OLED_DI  = "gpio132"
  9.         OLED_RST = "gpio133"
  10.         OLED_DC  = "gpio138"
  11.         OLED_CS  = "gpio139"

  12.         OLED_CMD  = 0 //写命令
  13.         OLED_DATA = 1 //写数据

  14.         SIZE       = 16
  15.         Max_Column = 128
  16.         Max_Row    = 64
  17. )

  18. func Init() {
  19.         gpio.OpenGpioFile(OLED_CLK)
  20.         gpio.OpenGpioFile(OLED_DI)
  21.         gpio.OpenGpioFile(OLED_RST)
  22.         gpio.OpenGpioFile(OLED_DC)
  23.         gpio.OpenGpioFile(OLED_CS)

  24.         SetRst()
  25.         time.Sleep(time.Millisecond * 100)
  26.         ClrRst()
  27.         time.Sleep(time.Millisecond * 100)
  28.         SetRst()

  29.         WriteByte(0xAE, OLED_CMD) //--turn off oled panel
  30.         WriteByte(0x00, OLED_CMD) //---set low column address
  31.         WriteByte(0x10, OLED_CMD) //---set high column address
  32.         WriteByte(0x40, OLED_CMD) //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  33.         WriteByte(0x81, OLED_CMD) //--set contrast control register
  34.         WriteByte(0x66, OLED_CMD) // Set SEG Output Current Brightness
  35.         WriteByte(0xA1, OLED_CMD) //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  36.         WriteByte(0xC8, OLED_CMD) //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  37.         WriteByte(0xA6, OLED_CMD) //--set normal display
  38.         WriteByte(0xA8, OLED_CMD) //--set multiplex ratio(1 to 64)
  39.         WriteByte(0x3f, OLED_CMD) //--1/64 duty
  40.         WriteByte(0xD3, OLED_CMD) //-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
  41.         WriteByte(0x00, OLED_CMD) //-not offset
  42.         WriteByte(0xd5, OLED_CMD) //--set display clock divide ratio/oscillator frequency
  43.         WriteByte(0x80, OLED_CMD) //--set divide ratio, Set Clock as 100 Frames/Sec
  44.         WriteByte(0xD9, OLED_CMD) //--set pre-charge period
  45.         WriteByte(0xF1, OLED_CMD) //Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  46.         WriteByte(0xDA, OLED_CMD) //--set com pins hardware configuration
  47.         WriteByte(0x12, OLED_CMD)
  48.         WriteByte(0xDB, OLED_CMD) //--set vcomh
  49.         WriteByte(0x40, OLED_CMD) //Set VCOM Deselect Level
  50.         WriteByte(0x20, OLED_CMD) //-Set Page Addressing Mode (0x00/0x01/0x02)
  51.         WriteByte(0x02, OLED_CMD) //
  52.         WriteByte(0x8D, OLED_CMD) //--set Charge Pump enable/disable
  53.         WriteByte(0x14, OLED_CMD) //--set(0x10) disable
  54.         WriteByte(0xA4, OLED_CMD) // Disable Entire Display On (0xa4/0xa5)
  55.         WriteByte(0xA6, OLED_CMD) // Disable Inverse Display On (0xa6/a7)
  56.         WriteByte(0xAF, OLED_CMD) //--turn on oled panel

  57.         WriteByte(0xAF, OLED_CMD) /*display ON*/
  58.         Clear()
  59.         SetPos(0, 0)
  60. }

  61. func SetClk() {
  62.         gpio.GpioNSetValue(OLED_CLK, "1")
  63. }

  64. func ClrClk() {
  65.         gpio.GpioNSetValue(OLED_CLK, "0")
  66. }

  67. func SetDi() {
  68.         gpio.GpioNSetValue(OLED_DI, "1")
  69. }

  70. func ClrDi() {
  71.         gpio.GpioNSetValue(OLED_DI, "0")
  72. }

  73. func SetRst() {
  74.         gpio.GpioNSetValue(OLED_RST, "1")
  75. }

  76. func ClrRst() {
  77.         gpio.GpioNSetValue(OLED_RST, "0")
  78. }
  79. func SetDc() {
  80.         gpio.GpioNSetValue(OLED_DC, "1")
  81. }

  82. func ClrDc() {
  83.         gpio.GpioNSetValue(OLED_DC, "0")
  84. }
  85. func SetCs() {
  86.         gpio.GpioNSetValue(OLED_CS, "1")
  87. }

  88. func ClrCs() {
  89.         gpio.GpioNSetValue(OLED_CS, "0")
  90. }

  91. func WriteByte(dat, cmd byte) {
  92.         if cmd != 0 {
  93.                 SetDc()
  94.         } else {
  95.                 ClrDc()
  96.         }
  97.         ClrCs()

  98.         for i := 0; i < 8; i++ {
  99.                 ClrClk()
  100.                 if dat&0x80 != 0 {
  101.                         SetDi()
  102.                 } else {
  103.                         ClrDi()
  104.                 }
  105.                 SetClk()
  106.                 dat <<= 1
  107.         }
  108.         SetCs()
  109.         SetDc()
  110. }

  111. func SetPos(x, y byte) {
  112.         WriteByte(0xb0+y, OLED_CMD)
  113.         WriteByte(((x&0xf0)>>4)|0x10, OLED_CMD)
  114.         WriteByte((x&0x0f)|0x01, OLED_CMD)
  115. }

  116. func Clear() {
  117.         for i := byte(0); i < 8; i++ {
  118.                 WriteByte(0xb0+i, OLED_CMD) //设置页地址(0~7)
  119.                 WriteByte(0x00, OLED_CMD)   //设置显示位置—列低地址
  120.                 WriteByte(0x10, OLED_CMD)   //设置显示位置—列高地址
  121.                 for n := 0; n < 128; n++ {
  122.                         WriteByte(0, OLED_DATA) //更新显示
  123.                 }
  124.         }
  125. }

  126. func ShowChar(x, y, chr byte) {
  127.         c := chr - ' ' //得到偏移后的值
  128.         if x > Max_Column-1 {
  129.                 x = 0
  130.                 y = y + 2
  131.         }
  132.         if SIZE == 16 {

  133.                 SetPos(x, y)
  134.                 for i := 0; i < 8; i++ {
  135.                         WriteByte(F8X16[int(c)*16+i], OLED_DATA)
  136.                 }

  137.                 SetPos(x, y+1)
  138.                 for i := 0; i < 8; i++ {
  139.                         WriteByte(F8X16[int(c)*16+i+8], OLED_DATA)
  140.                 }

  141.         } else {
  142.                 SetPos(x, y+1)

  143.         }
  144. }

  145. func ShowString(x, y byte, chrs string) {
  146.         for _, v := range []byte(chrs) {
  147.                 ShowChar(x, y, v)
  148.                 x += 8
  149.                 if x > 120 {
  150.                         x = 0
  151.                         y += 2
  152.                 }

  153.         }

  154. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入20汤圆

发表于 2020-4-4 15:03:35 来自手机 | 显示全部楼层
一直在偷偷学习老哥的教程

出0入4汤圆

发表于 2020-4-4 15:12:36 | 显示全部楼层
go语言将C语言的void 换成了 func ,  for(;;;) 的括号去掉了,其他没有变化?

出0入0汤圆

 楼主| 发表于 2020-4-4 15:21:43 | 显示全部楼层
sunliezhi 发表于 2020-4-4 15:12
go语言将C语言的void 换成了 func ,  for(;;;) 的括号去掉了,其他没有变化?

也许有更go style 的写法,我急于实现,就从c代码改了一下

出0入4汤圆

发表于 2020-4-4 15:35:55 | 显示全部楼层
FireBrain 发表于 2020-4-4 15:21
也许有更go style 的写法,我急于实现,就从c代码改了一下

哦呵呵, 自己改,牛B啊!
那你肯定修改了解析器才行,C的解析器不能用了

出0入0汤圆

 楼主| 发表于 2020-4-4 15:38:04 | 显示全部楼层
sunliezhi 发表于 2020-4-4 15:35
哦呵呵, 自己改,牛B啊!
那你肯定修改了解析器才行,C的解析器不能用了 ...

当然,用go编译器编译

出0入0汤圆

发表于 2020-4-5 16:02:10 | 显示全部楼层
f1c100s是怎么从0添加go环境的呢?有没有简易的教程

出0入0汤圆

 楼主| 发表于 2020-4-5 20:59:32 | 显示全部楼层
erdao 发表于 2020-4-5 16:02
f1c100s是怎么从0添加go环境的呢?有没有简易的教程

安装个go的编译器,就知道怎么玩了。自带交叉编译,可以生成f1c100s的执行文件

出0入36汤圆

发表于 2020-9-4 00:56:43 来自手机 | 显示全部楼层
难道是模拟spi?不应该是调用linux上spi的api接口么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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