东软载波单片机hr8p506驱动tft spi串口屏显示

浙有正能量 2024-06-02 13:10:15
最佳回答
1【1】打开keil uv**ion5建立好相应的工程项目,添加相应的文件和头文件路径,在建立工程过程中需要使用keil插件,可到官网去下载,亦可联系我。 【2】.初始化spi gpio配置。spi_mosi、spi_m**o、spi_sck、spi_cs配置为复用输出模式,spi_cs亦可配置为普通输出模式。若是使用模拟spi方式直接配置为普通模式输出即可。#define tft_spi0_mosi_pingpio_pin_a13#define tft_spi0_m**o_pingpio_pin_a12#define tft_spi0_sck_pingpio_pin_a11#define tft_spi0_cs_pingpio_pin_a10static void vtft_spi0_gpio_configuration(void){gpio_initsettingtype gpio_initstructure;gpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func3;//reuse functio3 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_strong;//strong output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_spi0_m**o_pin, &gpio_initstructure);//init tft_spi0_m**o_pingpio_init(tft_spi0_mosi_pin, &gpio_initstructure);//init tft_spi0_mosi_pingpio_init(tft_spi0_sck_pin, &gpio_initstructure);//init tft_spi0_sck_pingpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func0;//reuse functio0 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_strong;//strong output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_spi0_cs_pin, &gpio_initstructure);//init tft_spi0_cs_pin} 【3】配置spi。spi频率、数据格式、通讯模式、发送帧位宽、延时接收使能、发送间隔使能、发送间隔周期。若使用模拟spi方式此步骤可以忽略,最后初始化spi。static void vtft_spi0_configuration(void){spi_initstrutype spi_initstructure;spi_initstructure.spi_freq = 10000000;//spi frequencyspi_initstructure.spi_df = spi_fallsendr**erec;//data r**e send fall recievespi_initstructure.spi_mode = spi_mode_master;//work modespi_initstructure.spi_dw = 7;//data bit widthspi_initstructure.spi_delayrec = d**able;//delay recievespi_initstructure.spi_delaysend = d**able;//delay sendspi_initstructure.spi_senddelayperoid = 0;//delay send peroidspi_init(spi0, &spi_initstructure);//init spi0spi0_enable();//spi0 enable} void vtft_spi0_initialization(void){vtft_spi0_gpio_configuration();vtft_spi0_configuration();} 【4】配置tft gpio。tft_reset、tft_rs配置为普通模式输出。#define tft_reset_pingpio_pin_a15#define tft_rs_pingpio_pin_a14static void vtft_gpio_configuration(void){gpio_initsettingtype gpio_initstructure;gpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func0;//reuse function 0 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_normal;//normal output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_reset_pin, &gpio_initstructure);//init tft_reset_pingpio_init(tft_rs_pin, &gpio_initstructure);//init tft_rs_pin}2【1】编写写指令、写数据函数,这两个函数是最核心的函数。若使用模拟spi方式,重点也是修改这两个函数。 #define tft_cs_set()gpio_setbit(tft_spi0_cs_pin)#define tft_cs_clr()gpio_resetbit(tft_spi0_cs_pin) #define tft_rs_set()gpio_setbit(tft_rs_pin)#define tft_rs_clr()gpio_resetbit(tft_rs_pin) 写字节命令函数void vtft_writebyte_command(u8 cmd){tft_cs_clr();tft_rs_clr();spi_sendbyte(spi0, cmd);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();} 写字节数据函数void vtft_writebyte_data(u8 dat){tft_cs_clr();tft_rs_set();spi_sendbyte(spi0, dat);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();} 写u16数据函数void vtft_write_data(u16 dat){tft_cs_clr();tft_rs_set();spi_sendbyte(spi0, (u8)(dat >> 8));while(spi_getstatus(spi0, spi_sta_idle) == reset);spi_sendbyte(spi0, (u8)dat);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();}3【1】配置滴答定时器做延时使用,有毫秒级和微秒级的延时,最低10us的倍数延时。 滴答定时器为24bit倒计时计数器,属于内核定时器,在arm cortex-m0/m3/m4上都有。u8 fac_us = 0; u16 fac_ms = 0;void vsystick_delay_initialization(void){systick_initstrutype systick_initstructure; fac_us = (systemcoreclock / 3000000) * 10;//systick value=10usfac_ms = fac_us * 100;//1mssystick_initstructure.systick_clksource = systick_clks_base;//systick colck = hclk/3 = 16msystick_initstructure.systick_itenable = d**able;//d**able systick interruptsystick_init(&systick_initstructure);//init systick} 毫秒级延时void delay_ms(u16 nms) {u32 temp = 0;systick->load = (u32)nms*fac_ms;//auto reload value systick->val = 0x00;//systick current valuesystick->ctrl |= systick_ctrl_enable_msk;//enable systick do{temp = systick->ctrl;}while((temp&0x01) && (!(temp&(1<<16))));//enable systick and count non-arrival systick->ctrl &= ~systick_ctrl_enable_msk;//d**able systicksystick->val = 0x00;//systick current value} 10微秒级延时void delay_10us(u32 nus){u32 temp = 0;systick->load = (u32)nus*fac_us;//auto reload value systick->val = 0x00;//systick current valuesystick->ctrl |= systick_ctrl_enable_msk;//enable systick do{temp = systick->ctrl;}while((temp&0x01)&& (!(temp&(1<<16))));//enable systick and count non-arrival systick->ctrl &= ~systick_ctrl_enable_msk;//d**able systicksystick->val = 0x00;//systick current value }4【1】编写tft出厂参数校准函数,这个函数里才参数都是有tft lcd厂家调试好的参数,直接拿过来用就行,需要设置的参数比较多,这里只展示一部分。 static void vtft_default_set(void){tft_reset_clr();delay_ms(500);tft_reset_set();delay_ms(100);tft_cs_clr();vtft_writebyte_command(0xcb); vtft_writebyte_data(0x39); vtft_writebyte_data(0x2c); vtft_writebyte_data(0x00); vtft_writebyte_data(0x34); vtft_writebyte_data(0x02); vtft_writebyte_command(0x36);//memory access control #if ( tft_d**play_mode_level > 0 )//横屏 竖屏选择 vtft_writebyte_data(0xe8);#elsevtft_writebyte_data(0x48);#endif vtft_writebyte_command(0x3a); vtft_writebyte_data(0x55); .......}5【1】设置光标位置void vtft_setcursor_position(u16 x, u16 y){vtft_writebyte_command(0x2a);//set x linevtft_writebyte_data(x>>8); vtft_writebyte_data(x&0xff); vtft_writebyte_command(0x2b); //set y rowvtft_writebyte_data(y>>8); vtft_writebyte_data(y&0xff);} 【2】绘制窗口void vtft_set_window(u16 x0, u16 y0, u16 x1, u16 y1, u16 color){u16 x = 0;u16 y = 0;vtft_writebyte_command(0x2a);//set x linevtft_writebyte_data(x0>>8);vtft_writebyte_data(x0&0xff);vtft_writebyte_data(x1>>8);vtft_writebyte_data(x1&0xff); vtft_writebyte_command(0x2b);//set y rowvtft_writebyte_data(y0>>8);vtft_writebyte_data(y0&0xff);vtft_writebyte_data(y1>>8);vtft_writebyte_data(y1&0xff);vtft_writebyte_command(0x2c);//write gram for(x=x0; x<=x1; x++){for(y=y0; y<=y1; y++)vtft_write_data(color);}} 【3】画点函数void vtft_drawing_point(u16 x, u16 y, u16 color){vtft_setcursor_position(x, y);vtft_writebyte_command(0x2c);vtft_write_data(color);} 【4】在指定位置显示一个字符,可设置背景色和前景色,共有三种字体选择void vtft_show_chars(u16 x, u16 y, u8 size, u8 chr, u16 backcolor, u16 fontcolor){u16 starty = 0;u8 fontbyte = 0;u8 strpoint = 0;u8 m=0, i=0;starty = y;chr = chr - ' ';//ascii the first character ** empty,value 32fontbyte = ((size/8) + ((size%8) ? 1 : 0)) * (size/2);//char bytefor(i=0; i<fontbyte; i++){if(size == tft_font_size_1206)//1206strpoint = ascii_1206[chr][i]; if(size == tft_font_size_1608)//1608strpoint = ascii_1608[chr][i];else if(size == tft_font_size_2412)//2412strpoint = ascii_2412[chr][i];else return;for(m=0; m<8; m++){ if(strpoint & 0x80)vtft_drawing_point(x, y, fontcolor);//char colorelsevtft_drawing_point(x, y, backcolor);//background colorstrpoint <<= 1; if(++y >= tft_yheight_max)//y maxreturn;if((y - starty) == size){y = starty;if(++x >= tft_xwidth_max)//x maxreturn;break;}} }} 【5】在指定位置显示字符串,超出范围可自动换行显示,可设置背景色和前景色,共有三种字体选择。void vtft_show_sting(u16 x, u16 y, u8 size, u8 *pstr, u16 backcolor, u16 fontcolor){while((*pstr >= ' ') && (*pstr <= '~'))//while('\n' != *psting){if((x + size/2) > tft_xwidth_max)//next char start position{x = 0;y = y + size;//next fong high}if((y + size) > tft_yheight_max)return;vtft_show_chars(x, y, size ,*pstr, backcolor, fontcolor);//tft show charx = x + size/2;pstr++;//next char}}6【1】在指定位置显示数字,static u32 uxtft_resolve_num(u8 m, u8 n){u32 result=1;while(n--)result *= m; return result;} void vtft_show_number(u16 x, u16 y, u8 size, u32 num, u8 len, u16 backcolor, u16 fontcolor){u8 i,temper = 0;for(i=0; i<len; i++){if((x + size/2) > tft_xwidth_max)//next char start position{x = 0;y = y + size;//next fong high}if((y+ size) > tft_yheight_max)return;temper = (num/uxtft_resolve_num(10, len-i-1))%10;vtft_show_chars(x, y, size ,(temper + '0'), backcolor, fontcolor);x = x + size/2;}}7【1】配置系统时钟为48mhz,使能需要的外设时钟,失能不需要的外设时钟,着这样可以降低功耗。static void vperipheral_clock_configuration(void){deviceclock_config(scu_succlk, enable);//enable suc clockdeviceclock_config(scu_gpioclk, enable);//enable gpio clockdeviceclock_config(scu_spioclk, enable);//enable spi0 clockdeviceclock_config(scu_uart1clk, enable);//enable uart1 clockdeviceclock_config(scu_t16n2clk, enable);//enable t16n2 clockdeviceclock_config(scu_iapclk, d**able);//d**able iap clockdeviceclock_config(scu_t16n0clk, d**able);//d**able t16n0 clockdeviceclock_config(scu_t16n3clk, d**able);//d**able t16n3 clockdeviceclock_config(scu_uart0clk, d**able);//d**able uart0 clockdeviceclock_config(scu_wdtclk, d**able);//d**able wdt clockdeviceclock_config(scu_t16n1clk, d**able);//d**able t16n1 clockdeviceclock_config(scu_rtcclk, d**able);//d**able rtc clockdeviceclock_config(scu_euart0clk, d**able);//d**able euart0 clockdeviceclock_config(scu_spi1clk, d**able);//d**able spi1 clockdeviceclock_config(scu_i2c0clk, d**able);//d**able i2c0 clockdeviceclock_config(scu_adcclk, d**able);//d**able adc clockdeviceclock_config(scu_t32n0clk, d**able);//d**able t32n0 clock} void vsystem_clock_configuration(void){scu_regunlock();//unlock scu reg**terdeviceclock_config(scu_succlk, enable);//enable suc clockscu_sysclkselect(scu_clk_hrc);//system clock hrc = 16mpllclock_config(enable ,scu_pll_in16m, scu_pll_48m, enable);//system clock pll = 48m scu->sclken0.sysclk_div = 0;//system clock later div=0 sys=48mscu_re**();//lock scu reg**ter d**able_global_interrupt();vperipheral_clock_configuration();//vperipheral clock configurationeanble_user_interrupt();}8【1】编写tft初始化函数 void vtft_initialization(void){vtft_gpio_configuration();vtft_default_set();vtft_clear_screen(white);vtft_writebyte_command(0x28);vtft_set_window(0, 0, tft_xwidth_max, 30, black);vtft_show_sting(80, 3, 24, "tft lcd study", black, white);vtft_windowrange(0, 0, 320, 240);vtft_show_sting(5, 40, 12, "1206 font: string 0123456789 abcdef !@#$%^&*()_+{}|<", red, black);vtft_show_sting(5, 55, 16, "1608 font: string 0123 abc !@#$%^&*()", black, yellow);vtft_show_sting(5, 75, 24, "2412 font: string 123 abc", blue, white); vtft_drawing_line(0, 108, 320, 108, red);vtft_drawing_line(0, 110, 320, 110, blue);vtft_drawing_line(0, 112, 320, 112, black);vtft_drawing_circular(70, 175, 55, blue);vtft_drawing_circular(70, 175, 35, red);vtft_drawing_circular(70, 175, 15, red);vtft_show_sting(150, 120, 24, "number test:", green, black);vtft_show_sting(150, 155, 24, "dec:", white, black);vtft_show_number(200, 155, 24, 0, 4, black, white);vtft_show_sting(150, 185, 24, "hex:", white, black);vtft_show_bytehex(200, 185, 24, 0, blue, white);vtft_writebyte_command(0x29);vtft_windowrange(0, 0, 320, 240);} 【2】编写系统初始化函数static void system_initialization(void){systeminit();vsystem_clock_configuration();vsystick_delay_initialization();vtft_spi0_initialization();vtft_initialization();delay_ms(500);}9编写主函数,编译代码,有错误修改,直到无错误,下载到板子上查看效果。int main(void){u16 i = 0;system_initialization(); while(1){i++;vtft_show_number(200, 155, 24, i, 4, black, white);vtft_show_bytehex(200, 185, 24, (u8)i, blue, white);delay_ms(1000);}}end 20210311
汇率兑换计算器

类似问答
  • 设置电脑一机双屏显示
    • 2024-06-02 18:18:31
    • 提问者: 未知
    1查看电脑是否支持双屏显示。一个是查看电脑主机上的显卡。现在的显卡输入有三种接口:vga、dvi、hdmi。我们日常使用较多的是vga接口,dvi接口较少。hmdi接口是近几年出现的高清接口,可以传输图像和声音。2在电脑桌面点击右键,弹出桌面属性界面。win7系统在属性中选择“屏幕分辨率”,xp系统选择属性下面的设置选项框。不同的系统版本会有不同,可以根据系统的版本选择你需要的项目。3在屏幕分辨率...
  • 为什么有些mos管要用三极管驱动,单片机io不能直接驱动吗?
    • 2024-06-02 18:59:00
    • 提问者: 未知
    例如我在维修电磁炉时就可以看到,作为控制lc振荡的绝缘栅场效应...上图是常用n沟道mos管ao4468参数手册中给出的导通内阻参考值,当控制电压4.5v的时候,导通内阻小于22mω;...
  • amo**和**哪个好
    • 2024-06-02 15:56:06
    • 提问者: 未知
    那当然是amo**好了
  • 单片机串行口与普通io口区别?
    • 2024-06-02 09:55:44
    • 提问者: 未知
    单片机串行口与普通io口区别如下:1、串口用作串行通信,通信包括iic,rs485,rs232等,它也是输出是定速度的0-1-0-之类变化。2、i/o口是指来关量的输入或输出,输入就是在该脚加高电平,即为1,低电平为0,输出也是如此。简单来说:指i/o口是输入\输出接口,串行口是通讯接口。i/o接口是一电子电路(以ic芯片或接口板形式出现 ),其内有若干专用寄存器和相应的控制逻辑电路构成。它是cp...
  • 什么是东软载波(300183)
    • 2024-06-02 01:09:23
    • 提问者: 未知
    公司名称:青岛东软载波科技股份有限公司英文名称:qingdao eastsoft communication technology co.,ltd.股票代码:300183证券类别:深交所创业板a股所属行业:电子信息董事长:崔健所属地域:山东成立日期:1992-08-05上市日期:2011-02-22发行数量:2500万股每股发行价:41.45元发行市盈率:59.23倍公司简介:公司前身青岛东软电脑...
  • 什么是tft彩屏呢
    • 2024-06-02 17:47:14
    • 提问者: 未知
    屏幕颜色:这里所指幕颜色实质上即为色概念。是表示手机液晶显示屏亮度强弱的指数 标准,也就常所说的色彩指数。目前彩屏手机的色阶指数从低到高可分三个层次,最低单色,其次是256色、4096色、 65536色; 目前最高的为26万色。256=2的8次方,即8位彩色,依次律推,65536色=2的16次方,即通常所说 的16位真彩色,26万=2的18次方,也就是18位真彩。其实65536色已基本可满足我们肉...
  • stc89c52单片机怎么实现用两个串口控制两个模块?
    • 2024-06-02 22:04:43
    • 提问者: 未知
    stc89c52单片机的确就有一个串口,当然可以在外部加一个模拟开关来扩展两个串口,但是两个串口是分时工作的,就是不能同时收发。其实,选择stc12c5a60s2,就完全解决了这个问题吗,它就有两个独立串口,价格上不比stc89c52高多少,还有stc现在推出了最新的stc15系列的单片机,都是有两个独立串口的,价格更低了,还完全可以省掉外部复位电路和时钟电路的晶振,非常方便,为什么不选择这款昵?...
  • 万能声卡驱动软件下载 万能声卡驱动下载安装 xp万能声卡驱?
    • 2024-06-02 19:30:51
    • 提问者: 未知
    via芯片万能声卡驱动.最新版本;官方网站via芯片声卡万能驱动;软件...如果您有安装windowsxp sp2补丁,并且无法下载本站软件时,请暂时关闭windows防火墙服务软件大**002 k;...
  • 东软载波待遇怎么样
    • 2024-06-02 22:54:37
    • 提问者: 未知
    在胶州野外工服压金100宿舍30o饭卡5o0,**压一个月中途怕你跑了,监狱化管理上厕所没时间加班没工资日均70元左右干12一18个小时,离职拖欠工资少的让你想不到。
  • 通达信软件怎么可以一主机一软件多屏显示
    • 2024-06-02 04:56:55
    • 提问者: 未知
    现在的主机都有两个接口,买个hdmi高清接口转换器就可以多接个屏幕,就可以实现两个屏幕同步或者分别显示(通达信软件也可以多开)。——明阳程序化
汇率兑换计算器

热门推荐
热门问答
最新问答
推荐问答
新手帮助
常见问题
房贷计算器-九子财经 | 备案号: 桂ICP备19010581号-1 商务联系 企鹅:2790-680461

特别声明:本网为公益网站,人人都可发布,所有内容为会员自行上传发布",本站不承担任何法律责任,如内容有该作者著作权或违规内容,请联系我们清空删除。