久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4016|回復: 5
收起左側

HT1621B初始化后總是顯示亂碼 有沒有大神可以幫忙解決

[復制鏈接]
ID:714253 發表于 2020-4-1 10:23 | 顯示全部樓層 |閱讀模式
18黑幣
用的是STC8F2K16S2單片機
連接液晶顯示  SEG9-SEG27    COM0-COM3

#include "STC8F.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
#define BIAS 0X52 //必須跟硬件電路的COM匹配,1個或者2個COM 0x42  3個COM 0X4A 4個COM 0x52  1/3LCD驅動器偏壓 4個公共端口COM
#define RC256 0X30
#define SYSTEN 0x02
#define SYSDIS 0x00
#define LCDON 0X06
void sendbitHT1621(uchar nbit,uchar n);//發送一個字節中的n位到HT1621里,驅動程序的最底層部分
void write_com(uchar cmdcode);//寫命令到LCD
void init_lcd();//初始化LCD屏
void seg_display(uchar col,uchar pag);//顯示基本單位點
void scerrn_clear();//清空屏幕的內容
void delay();  //5s
//說明:凡是輸出IO后綴都是_dr,凡是輸入后綴都是_sr
sbit ht162x_data_dr=P0^0;
sbit ht162x_cs_dr=P0^2;
sbit ht162x_wr_dr=P0^3;
void main()
{
  init_lcd();  

}
//發送一個字節中的N位到HT1621里,驅動程序的最底層部分//
void sendbitHT1621(uchar nbit,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
  ht162x_wr_dr=0;
  if(nbit&0x80) //判斷最高位
  {
   ht162x_data_dr=1;
  }
  else
  {
   ht162x_data_dr=0;
  }
  _nop_();
  _nop_();
  _nop_();
  ht162x_wr_dr=1;
  _nop_();
  _nop_();
  _nop_();
  nbit<<=1;   
}
}
//寫命令到LCD,驅動液晶程序的一部分//
void write_com(uchar cmdcode)
{
ht162x_cs_dr=0; //選通HT1621
_nop_();
_nop_();
sendbitHT1621(0x80,4);   //寫入命令
sendbitHT1621(cmdcode,8);  //寫入控制命令
_nop_();
_nop_();
ht162x_cs_dr=1;
_nop_();
_nop_();
_nop_();
}
void init_lcd()
{
ht162x_data_dr=1;
ht162x_cs_dr=1;
ht162x_wr_dr=1;
write_com(SYSTEN); // 打開系統振蕩器
write_com(RC256); //啟動內部256K RC振蕩器
write_com(BIAS);  //1/3LCD驅動器偏壓 4個公共端口COM
write_com(LCDON); //開啟LCD
}
//核心內容  顯示基本單位點,col代表X軸,X軸的數據用位來表示,一個字節中的高4位來表示,pag表示Y軸
void seg_display(uchar col,uchar pag)
{
// pag<<=2;
ht162x_cs_dr=0;
_nop_();
_nop_();
sendbitHT1621(0XA0,3); //發送寫數據模式 高位101   101為6 位RAM 地址,
sendbitHT1621(pag<<2,6);  //寫入地址數據
sendbitHT1621(col,4);  //寫入數據
ht162x_cs_dr=1;
_nop_();
_nop_();
}
//清空屏幕內容
void screen_clrar()
{
uchar i;
uchar y=0;
for(i=0;i<32;i++)
{
  seg_display(0X00,y);
  y=y+1;
}
}

注:這個還有一個毛病就是每次燒完程序之后 要斷電很久屏幕才會發生變化,這個也搞不清是什么原因

最佳答案

查看完整內容

給你一個測試程序參考
回復

使用道具 舉報

ID:213173 發表于 2020-4-1 10:23 | 顯示全部樓層
給你一個測試程序參考
  1. #include <STC89C5xRC.H>
  2. //宏定義新LCD的操作命令
  3. #define ComMode  0x52    //4COM,1/3bias                1000 0101 0010
  4. //#define ComMode  0x50  //4COM,1/2bias          1000 0101 0000
  5. #define RCosc    0x30    //內部RC振蕩器(上電默認)1000 0011 0000
  6. #define LCD_on   0x06    //打開LCD顯示 偏壓發生器1000 0000 0110
  7. #define LCD_off  0x04    //關閉LCD顯示(上電默認)
  8. #define Sys_en   0x02    //系統振蕩器開 1000 0000 0010
  9. #define Ctrl_cmd 0x80    //寫控制命令   1000
  10. #define Data_cmd 0xa0    //寫數據命令   1010
  11. // 端口聲明
  12. sbit DIPIN=P3^7;
  13. sbit CLKPIN=P3^6;
  14. sbit CSPIN=P3^5;  

  15. /**-------------------------------------------------------------------------
  16. Name: SendBit_1621(送數據程序)
  17. ---------------------------------------------------------------------------*/
  18. void SendBit_1621(unsigned char sdata,unsigned char cnt) //sdata 的高cnt 位寫入HT1621,高位在前
  19. {
  20.         unsigned char i;
  21.         for(i=0;i<cnt;i++)
  22.         {
  23.                 CLKPIN=0;         
  24.                 if(sdata&0x80)
  25.                         DIPIN=1;
  26.                 else DIPIN=0;
  27.                 CLKPIN=1;
  28.                 sdata<<=1;
  29.         }
  30. }
  31. /*-------------------------------------------------------------------------
  32. Name: SendCmd(送命令)
  33. 寫入標志碼"100"和9位comma命令,由于沒有使用到更改時鐘輸出等命令
  34. 為了編程方便直接將command 的最高位寫"0"
  35. ---------------------------------------------------------------------------*/
  36. void SendCmd_1621(unsigned char command)//寫命令
  37. {//3位標志碼 + 9位命令,共12位
  38.         CSPIN=0; //執行一個下降沿                                       
  39.         SendBit_1621(0x80,4);    //寫入標志碼"100"和9位comma命令的最高1位共4位
  40.         SendBit_1621(command,8); //寫入9位comma命令的后8位,組成1000 xxxx xxxx
  41.         CSPIN=1;//送數完成后置高電平
  42. }

  43. /**-------------------------------------------------------------------------
  44. Name: Write_1621(送命令和數據程序)
  45. 寫入標志碼"101"和6位addr地址碼和8位sdata顯示數據。
  46. ---------------------------------------------------------------------------*/
  47. void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//寫數據
  48. {//3位標志碼 + 6位寫數據命令 + len(4/8)位數據,共13/17位
  49.         addr<<=2;//高6位有效
  50.         CSPIN=0; //執行一個下降沿
  51.         SendBit_1621(0xa0,3);                //寫入標志碼"101"    寫數據命令101
  52.         SendBit_1621(addr,6);                //寫入addr 的高6位   寫數據命令xxxx xx
  53.         SendBit_1621(sdata,len);        //寫入8/4位 sdata數據  len=8/4
  54.         CSPIN=1;//送數完成后置高電平
  55. }
  56. /**-------------------------------------------------------------------------
  57. Name: Init_1621(初始化1621)
  58. -------------------------------------------------------------------------*/
  59. void LCD_Init()                                                //初始化
  60. {//程序輸入100 0+8=9位命令
  61.         SendCmd_1621(Sys_en);//Sys_en 0x02 系統振蕩器開          100 0 0000 0010
  62.         SendCmd_1621(RCosc); //RCosc 0x30 內部RC振蕩器(上電默認) 100 0 0011 0000
  63.         SendCmd_1621(ComMode);//4COM,1/3bias                     100 0 0101 0020
  64.         SendCmd_1621(LCD_on);//LCD_on 0x06 打開LCD顯示 偏壓發生器100 0 0000 0110
  65. }
  66. /*-------------------------------------------------------------------------
  67. Name: lcdwd1(點亮1621全部Seg)
  68. -------------------------------------------------------------------------*/
  69. void lcdwd1(unsigned char num)
  70. {
  71.         unsigned char i;
  72.         unsigned char addr=0;//寄存器起始地址0x00
  73.         for(i=0;i<num;i++)//num有效地址數
  74.         {
  75.                 Write_1621(addr,0xff,8);//addr為地址,0xff為數據,8為8位數據
  76.                 addr+=2;//順延2個4位地址碼
  77.         }
  78. }
  79. void main()
  80. {
  81.         LCD_Init();
  82.         while(1)
  83.         {
  84.                 lcdwd1(16);
  85.         }
  86. }
復制代碼

回復

使用道具 舉報

ID:584814 發表于 2020-4-2 10:14 | 顯示全部樓層
換個屏試試以排除硬件故障。
回復

使用道具 舉報

ID:282850 發表于 2020-4-2 11:26 | 顯示全部樓層
  我遇到過,后來知道怎么應對各種不同PCB的HT1621了。
1針對不同的HT1621必須確定是2COM、還是4COM,1COM(靜態驅動)、3COM的較少。
2、必須確定段碼地址,你可以寫一個TEST_seg(),掃描各個段,每段停一下并記下地址
3、根據段碼編寫碼表,心里要理清對應的位。
搞清楚上述兩點基本就不會亂碼了,不是硬件問題,基本是程序問題。 另外2com是一次地址寫兩段,4com是一次寫4段,HT1621每次就是寫4個bit的,剛好方便。2com的麻煩一些。
回復

使用道具 舉報

ID:677678 發表于 2021-6-30 23:30 | 顯示全部樓層
wulin 發表于 2020-4-1 10:23
給你一個測試程序參考

謝謝  你了
回復

使用道具 舉報

ID:677678 發表于 2021-7-2 00:21 | 顯示全部樓層

調試通了,謝謝你的資料
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品成人品 | 国产综合网站 | 国产精品视频一 | av天天干| 日韩免费一区 | 中文字幕乱码一区二区三区 | 亚洲欧美视频 | 中文字幕福利视频 | 欧美精品一区二区在线观看 | 国产精品久久久久久久久久 | 欧美 日韩 国产 成人 在线 | 日韩网站在线观看 | 中文字幕av亚洲精品一部二部 | 久草久草久草 | 日日干日日操 | 亚洲午夜精品一区二区三区他趣 | 99热在这里只有精品 | 久色激情 | 成人亚洲网 | 在线视频 欧美日韩 | 毛片一区二区三区 | 久久久精品视频一区二区三区 | 国产探花在线观看视频 | 成人片免费看 | 欧美日韩高清在线观看 | 黄色av大片 | 人操人人 | 天天拍天天操 | 激情六月丁香 | 黄色在线免费观看视频网站 | 男人天堂视频在线观看 | 国产农村妇女精品一二区 | 天天草天天 | 视频在线一区二区 | 国产精品久久久久久中文字 | 中文字幕精品一区二区三区精品 | 久久综合狠狠综合久久综合88 | 欧美男人天堂 | 国产美女特级嫩嫩嫩bbb片 | 亚洲一区亚洲二区 | 极品在线|