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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2864|回復: 16
打印 上一主題 下一主題
收起左側

KS0108 12864的屏幕顯示字斷開

  [復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 米花卷 于 2021-5-17 12:21 編輯


請問這樣情況應該怎么解決
#include <reg52.h>
#include<intrins.h>
#include<string.h>
#include "hanzi.h"  //漢字庫頭文件
#include "shuzi.h"  //字符庫頭文件
#define uchar unsigned char
#define uint unsigned int

//   lcd12864(ks0108)
#define LCD_DATA P0  //LCD8位并行數據口   
sbit LCD_RS=P1^2;          //寄存器選擇
sbit LCD_RW=P1^1;          //讀/寫選擇
sbit LCD_EN=P1^0;          //讀寫使能
sbit LCD_CS1=P1^3;          //右半屏選擇,1有效
sbit LCD_CS2=P1^4;          //左半屏選擇,1有效
sbit LCD_RST=P1^5;          //復位信號  
//*********************************************//
// 函數聲明
void init_lcd(void);
void lcd_delay(uint time);            //延時
void lcd_write_com(uchar cmdcode);    //寫命令
void lcd_write_data(uchar Rsspdata);  //寫數據
void lcd_Clr_Scr(void);               //清屏
void lcd_werite_x_y(uchar x,uchar y); //寫地址
void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat); //任意位置顯示任意漢字
void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat); //任意位置顯示任意字符
void lcd_write_english2(uchar x,uchar y, uchar en,uchar *dat);
//****************************************************************************//
//---------------------------------------
//    主函數
//---------------------------------------
void main(void)
{
          init_lcd();     //初始化
          lcd_Clr_Scr();  //清屏
        while(1)
        {
                lcd_write_chinese(0,40,9,HANZI);
                lcd_write_chinese(0,56,10,HANZI);
                lcd_write_chinese(0,72,11,HANZI);
               
                //lcd_write_english(2,0,0,SHUZI);
                //lcd_write_english(2,8,1,SHUZI);
                //lcd_write_english(2,16,2,SHUZI);
               
                lcd_write_english2(2,28,5,SHUZI24);
                lcd_write_english2(2,52,5,SHUZI24);
                lcd_write_english2(2,76,5,SHUZI24);
       
               
               
               
               
                while(1);
        }
}
//---------------------------------------
//   延時函數
//---------------------------------------
void lcd_delay(uint time)
{
          uint i;
          for(i=0;i<time;i++);
}
//---------------------------------------
//   12864初始化函數
//---------------------------------------
void init_lcd(void)
{          
          LCD_RST=0;              //液晶復位
          lcd_delay(250);         //適當延時
          LCD_RST=1;              //復位結束
          LCD_CS1=1;                         //左半屏選通
          LCD_CS2=1;                             //右半屏選通       
          lcd_delay(250);         //適當延時
          lcd_write_com(0x3f);    //顯示開
}
//---------------------------------------
//   寫命令函數
//---------------------------------------
void lcd_write_com(uchar cmdcode)
{                                          
          LCD_RS=0;                        //選擇命令寄存器
          LCD_RW=0;                         //寫選通
          LCD_DATA=cmdcode;   //將命令寫入總線
          _nop_();            //空操作,做短暫的延時
          LCD_EN=1;           //E的下降沿,數據寫入
          _nop_();            //空操作,做短暫的延時
          LCD_EN=0;           //E的下降沿,數據寫入
}
//---------------------------------------
//   寫數據函數
//---------------------------------------
void lcd_write_data(uchar Rsspdata)
{

          LCD_RS=1;                        //選擇數據寄存器
          LCD_RW=0;                         //寫選通
          LCD_DATA=Rsspdata;  //將數據寫入總線
          _nop_();            //空操作,做短暫的延時
          LCD_EN=1;           //E的下降沿,數據寫入
          _nop_();            //空操作,做短暫的延時
          LCD_EN=0;           //E的下降沿,數據寫入
}
//---------------------------------------
//   清屏函數
//---------------------------------------
void lcd_Clr_Scr(void)
{
          uchar j,k;
          LCD_CS1=1;                                           //左半屏選通
          LCD_CS2=1;                                           //右半屏選通
          lcd_write_com(0x40+0);        //將列地址寫入  
          for(k=0;k<8;k++)
          {
                    lcd_write_com(0xb8+k);    //將行地址寫入       
                    for(j=0;j<64;j++)               //每行的64列都寫0,因為選了左右兩屏,
                    {
                              lcd_write_data(0x00); //64列同時寫0
                    }
          }
}
//---------------------------------------
//    地址寫入函數
//---------------------------------------
void lcd_werite_x_y(uchar x,uchar y)
{
          y=y&0x7f;                                 //限定范圍,列不能超過128
          x=x&0x07;                             //限定范圍,行不能超過8
          if(y<64)                    //如果列小于64
          {
                    LCD_CS1=1;                  //選通左半屏
                    LCD_CS2=0;                  //關閉右半屏
                    lcd_write_com(0x40+y);  //將列地址寫入  
          }
          else
          {
                    LCD_CS1=0;                  //關閉左半屏
                    LCD_CS2=1;                  //選通右半屏
                    y&=0x3f;
                    lcd_write_com(0x40+y);  //將列地址寫入         
          }
          lcd_write_com(0xb8+x);      //將行地址寫入       
}
//---------------------------------------
//     指定位置寫16*16漢字函數
//---------------------------------------
void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat)
{
          uchar i=0;       
          lcd_werite_x_y(x,y);             //設定起始地址
          for(i=0;i<16;i++)
          lcd_write_data(dat[hz*32+i]);    //先寫上半個字,共16個字節
          lcd_werite_x_y(x+1,y);           //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<16;i++)
          lcd_write_data(dat[hz*32+16+i]); //再寫下半個字,共16個字節
}       
//---------------------------------------
//     指定位置寫8*16字符函數
//---------------------------------------
void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat)
{
    uchar i=0;       
          lcd_werite_x_y(x,y);            //設定起始地址
          for(i=0;i<8;i++)
          lcd_write_data(dat[en*16+i]);   //先寫上半個字,共8個字節
          lcd_werite_x_y(x+1,y);          //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<8;i++)
          lcd_write_data(dat[en*16+8+i]); //再寫下半個字,共8個字節
}

//     指定位置寫24*48字符函數
//---------------------------------------
void lcd_write_english2(uchar x,uchar y, uchar en,uchar *dat)
{
    uchar i=0;       
          lcd_werite_x_y(x,y);            //設定起始地址
          for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+i]);   //先寫上半個字,共8個字節
          lcd_werite_x_y(x+1,y);          //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+24+i]); //再寫下半個字,共8個字節
        lcd_werite_x_y(x+2,y);          //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+48+i]); //再寫下半個字,共8個字節
        lcd_werite_x_y(x+3,y);          //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+72+i]); //再寫下半個字,共8個字節
        lcd_werite_x_y(x+4,y);          //設定起始地址,此次將行地址加1,以便寫下行
          for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+96+i]); //再寫下半個字,共8個字節
        lcd_werite_x_y(x+5,y);          //設定起始地址,此次將行地址加1,以便寫下行
        for(i=0;i<24;i++)
          lcd_write_data(dat[en*144+120+i]); //再寫下半個字,共8個字節
       
       
}
問題出在左右半屏的交接出,感覺右半屏沒及時開,但程序里找不到改動的地方,我把代碼補上,麻煩各位看看怎么改
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:35873 發表于 2021-5-17 05:12 | 只看該作者
估計你這程序是3片選的 顯示數據疊加造成的  改改就好了
回復

使用道具 舉報

板凳
ID:505032 發表于 2021-5-17 07:03 | 只看該作者
時序 、清屏;這方面多試試
回復

使用道具 舉報

地板
ID:71233 發表于 2021-5-17 08:10 | 只看該作者
用Proteus仿真嗎?如果是仿真的結果,建議用實物試試,實物的結果才比較可信。
回復

使用道具 舉報

5#
ID:247623 發表于 2021-5-17 08:10 | 只看該作者
程序問題,修改一下即可
回復

使用道具 舉報

6#
ID:554500 發表于 2021-5-17 08:33 | 只看該作者
這種情況多數是顯示數據的地址錯誤造成的,檢查下代碼吧!
回復

使用道具 舉報

7#
ID:16255 發表于 2021-5-17 10:53 | 只看該作者
新新科技 發表于 2021-5-17 08:10
用Proteus仿真嗎?如果是仿真的結果,建議用實物試試,實物的結果才比較可信。

的確,很多時候,Proteus仿真和實際電路的運行結果有很大的差距。
回復

使用道具 舉報

8#
ID:600695 發表于 2021-5-17 12:12 | 只看該作者
jialishoushi 發表于 2021-5-17 05:12
估計你這程序是3片選的 顯示數據疊加造成的  改改就好了

KS0108 12864應該是左右分屏的,字模在分屏處斷開了
回復

使用道具 舉報

9#
ID:600695 發表于 2021-5-17 12:14 | 只看該作者
sZhou 發表于 2021-5-17 07:03
時序 、清屏;這方面多試試

也感覺是這個問題,左半屏寫完右半屏沒開,但怎么改沒有思路了
回復

使用道具 舉報

10#
ID:600695 發表于 2021-5-17 12:14 | 只看該作者
新新科技 發表于 2021-5-17 08:10
用Proteus仿真嗎?如果是仿真的結果,建議用實物試試,實物的結果才比較可信。

實物也一樣,只是這樣好截圖
回復

使用道具 舉報

11#
ID:600695 發表于 2021-5-17 12:15 | 只看該作者
新新科技 發表于 2021-5-17 08:10
用Proteus仿真嗎?如果是仿真的結果,建議用實物試試,實物的結果才比較可信。

字體16*16的時候仿真顯示正常,實物斷開,字體大了仿真都斷開
回復

使用道具 舉報

12#
ID:452984 發表于 2021-7-2 15:36 | 只看該作者
ks0108是左右半屏顯示的。NT7534是上下半屏顯示的,我遇到過類似的現象,液晶初始化程序里的起始位0x40改成0x60就行了。你可以試試此方法。
回復

使用道具 舉報

13#
ID:88256 發表于 2021-7-2 17:53 | 只看該作者
米花卷 發表于 2021-5-17 12:15
字體16*16的時候仿真顯示正常,實物斷開,字體大了仿真都斷開

說明你仿真的屏和實物屏還不完全一樣,這是程序上的問題,只能自己慢慢排查了
回復

使用道具 舉報

14#
ID:943857 發表于 2021-7-2 21:10 來自手機 | 只看該作者
仿真和實際往往相差,你要看下資料,即12864然后再找出原因
回復

使用道具 舉報

15#
ID:939710 發表于 2021-7-7 04:55 | 只看該作者
這個屏是分左右的,左邊列號從0-63   右邊列號0-63.你如果要在交界處描點需要修改函數。你的中  列號超過63默認從0開始了。你可以改成 超過63打開右邊屏繼續顯示
回復

使用道具 舉報

16#
ID:939710 發表于 2021-7-7 05:14 | 只看該作者
E:\項目文件\參考例程\51黑論壇_stm32_12864\stm32_12864\1.png
回復

使用道具 舉報

17#
ID:939710 發表于 2021-7-7 05:18 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费 | www.天天操 | 手机在线一区二区三区 | 亚洲丝袜天堂 | 九九热在线免费视频 | 亚洲第一黄色网 | 三级视频在线观看电影 | 免费爱爱视频 | 精品在线一区二区三区 | 欧美日韩三级在线观看 | 在线精品一区二区三区 | 国产精品久久久久久久岛一牛影视 | 91av视频| 亚洲福利在线视频 | 亚洲精品天堂 | 久久久久久九九九九九九 | 久久av综合 | 黄色av免费网站 | 99综合 | 丁香五月网久久综合 | 国产91精品久久久久久久网曝门 | 日韩成人免费av | 黄色免费在线观看网址 | 欧美成人不卡 | 黄色av一区| 久精品久久 | 国产一区h | 亚洲国产精品视频 | av网站推荐 | 亚洲国产二区 | 国产精品一区视频 | 久久精品国产免费高清 | 日韩欧美在线视频 | 成人深夜小视频 | 999久久久久久久久6666 | 欧美性大战久久久久久久蜜臀 | 天天玩天天操天天干 | 91精品国产91久久久久久 | 午夜亚洲 | 欧美精品在线免费 | 日韩国产中文字幕 |