[求助] 一个19264程序求帮助

monkeyfirst   2013-12-24 09:32 楼主
#ifndef _lcd_19264_h
#define _lcd_19264_h

#include "stm32f10x.h"
#include "misc.h"
#include "stdio.h"
//#include "stm32f10x_exti.h"

#define portcontrol        GPIOD       
#define portdata GPIOC       
#define busy GPIO_Pin_5          //rs
#define req GPIO_Pin_7          //e
#define reset GPIO_Pin_1
#define cs1  GPIO_Pin_3
#define cs2  GPIO_Pin_4
#define cs3  GPIO_Pin_2
#define rw  GPIO_Pin_6

#define write_chn 0xf0                //写国标汉字
#define write_cha 0xf1                //写8*8ascii字符
#define write_char 0xf9           //写8*16ascii字符
#define write_wei  0xf2                //写位点阵
#define write_zijie 0xf3        //写字节点阵
#define up  0xf5            //上移
#define down  0xf6          //下移
#define left  0xf7          //左移
#define right 0xf8          //右移
#define fanbai 0xfa         //反白功能
#define clr_screen 0xf4     //清屏
//extern u8 key;
extern u8 ni[];
//extern u8   addr_x;  
//extern u8  addr_y;

void delay(u32 n);
void delay_us(u32 nus);
void delay_ms(u16 nms);
void RCC_Configuration(void);
void GPIO_Configuration(void);

void lcd_init(void);
void lcd_clear(void);
void writ_com(u8 com,u8 addr_x,u8 addr_y);
void writ_date(u8 date);
void disp_china(u8 *chn,u8 addr_x,u8 addr_y,u8 row,u8 line);
void disp_chr(u8 *chr,u8 addr_x,u8 addr_y,u8 row,u8 line);
void disp_wei(u8 addr_x,u8 addr_y,u8 row,u8 line);
void Coordinate_axis(void);
void disp_differevalue(u8 *amp,u8 *freq);

int key(void);

#endif




#include "lcd_19264.h"
#include "stm32f10x.h"
#include "stdio.h"

u8 ni[]={/*--  文字:  你  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00};
void delay(u32 n)
{
         for(;n!=0;n--);
}
void RCC_Configuration(void)
{
        SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

}  
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_Init(GPIOD,&GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC,&GPIO_InitStructure);         

}

void delay_us(u32 nus)
{
        u32 temp;
        SysTick->LOAD=9*nus;
        SysTick->VAL=0x00;         //清空计数器
        SysTick->CTRL=0x01;         //使能,减到零是无动作,采用外部时钟源
        do
        {
                temp=SysTick->CTRL;        //读取当前倒计数值
        }while((temp&0x01)&&(!(temp&(1<<16))));        //等待时间到达
        SysTick->CTRL=0x00;        //关闭计数器
        SysTick->VAL=0x00;        //清空计数器
}
void delay_ms(u16 nms)
{
        u32 temp;
        SysTick->LOAD=9000*nms;
        SysTick->VAL=0x00;         //清空计数器
        SysTick->CTRL=0x01;         //使能,减到零是无动作,采用外部时钟源
        do
        {
                temp=SysTick->CTRL;        //读取当前倒计数值
        }while((temp&0x01)&&(!(temp&(1<<16))));        //等待时间到达
        SysTick->CTRL=0x00;        //关闭计数器
        SysTick->VAL=0x00;        //清空计数器
}

void writ_com(u8 com,u8 addr_x,u8 addr_y)
{
        writ_date(com);    //写命令
        writ_date(addr_x);  //写入X起始坐标
        writ_date(addr_y);  //写入Y起始坐标
}       
void writ_date(u8 date)
{

        while(GPIO_ReadInputDataBit(portcontrol,busy) == 1);  //查忙信号
        GPIO_Write(portdata, date);  
        delay_us(10);  
        GPIO_WriteBit(portcontrol,req,Bit_SET);            // e=1
        while(GPIO_ReadInputDataBit(portcontrol,busy) == 0);  
        delay_us(40);   
        GPIO_WriteBit(portcontrol,req,Bit_RESET);        //e=0
}
void disp_china(u8 *chn,u8 addr_x,u8 addr_y,u8 row,u8 line)         //显示中文
{
        u8 i=0,j=0;  
        for(j=addr_y;j         {
                for(i=addr_x;i                 {        
                        writ_com(write_chn,i,j);  
                        writ_date(chn[(j-addr_y)*row*2+(i-addr_x)*2]-0xa0);
                        writ_date(chn[(j-addr_y)*row*2+(i-addr_x)*2+1]-0xa0);     
                }   
        }
}
void lcd_init(void)
{
        GPIO_WriteBit(portcontrol,reset,Bit_RESET);
                delay_us(50);
                GPIO_WriteBit(portcontrol,reset,Bit_SET);
                GPIO_Write(GPIOD,0xffff);
                writ_com(0x3e,0,0);
                writ_com(0x3f,0,0);
        writ_com(0xc0,0,0);
                writ_com(0x40,0,0);
                writ_com(0xb8,0,0);
}
void lcd_clear(void)
{
        u8 x,y;
                GPIO_Write(GPIOD,0xffff);
                writ_com(0x3f,0,0);
               
        for (y=0;y<8;y++)
                {
                        writ_com(0xb8+y,0,0);
                        writ_com(0x40,0,0);
                        writ_com(0xc0,0,0);
            for(x=0;x<64;x++)
                    {               
                          
              writ_date(0x00);
                        }
                }
}



int main(void)
{
        RCC_Configuration(); //系统时钟初始化
        GPIO_Configuration();//端口初始化

        lcd_init();
        lcd_clear();
        GPIO_WriteBit(portcontrol,cs1,Bit_RESET);
        GPIO_WriteBit(portcontrol,cs2,Bit_SET);
        GPIO_WriteBit(portcontrol,cs3,Bit_SET);         //打开左屏
        disp_china(ni,0,0,16,16);
}

我是用stmf103做的
调试了两天了没调试出来,求各位哥哥姐姐给看看程序有什么问题呢

回复评论 (3)

程序太长,没有仔细看,你可以注意以下几点:
1. 每个端口检查看是否都受控制;
2. 调节液晶的显示对比度的可调电阻;
3. 查看时序看是否正确;
4. 发送命令和数据清添加延时。
我的博客
点赞  2013-12-24 10:39
谢谢哥哥,我查查看
点赞  2013-12-24 11:00
还是不可以。。。。
点赞  2013-12-24 11:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复